[Numpy-discussion] Deleting a row from a matrix
Travis Oliphant
oliphant.travis at ieee.org
Fri Aug 25 09:54:21 CDT 2006
Sebastian Haase wrote:
> On Friday 25 August 2006 07:01, Travis Oliphant wrote:
>
>> Keith Goodman wrote:
>>
>>> How do I delete a row (or list of rows) from a matrix object?
>>>
>>> To remove the n'th row in octave I use x(n,:) = []. Or n could be a
>>> vector of rows to remove.
>>>
>>> In numpy 0.9.9.2813 x[[1,2],:] = [] changes the values of all the
>>> elements of x without changing the size of x.
>>>
>>> In numpy do I have to turn it around and construct a list of the rows
>>> I want to keep?
>>>
>> Basically, that is true for now.
>>
>> I think it would be worth implementing some kind of function for making
>> this easier.
>>
>> One might think of using:
>>
>> del a[obj]
>>
>> But, the problem with both of those approaches is that once you start
>> removing arbitrary rows (or n-1 dimensional sub-spaces) from an array
>> you very likely will no longer have a chunk of memory that can be
>> described using the n-dimensional array memory model.
>>
>> So, you would have to make memory copies. This could be done, of
>> course, and the data area of "a" altered appropriately. But, such
>> alteration of the memory would break any other objects that have a
>> "view" of the memory area of "a." Right now, there is no way to track
>> which objects have such "views", and therefore no good way to tell
>> (other than the very conservative reference count) if it is safe to
>> re-organize the memory of "a" in this way.
>>
>> So, "in-place" deletion of array objects would not be particularly
>> useful, because it would only work for arrays with no additional
>> reference counts (i.e. simple b=a assignment would increase the
>> reference count and make it impossible to say del a[obj]).
>>
>> However, a function call that returned a new array object with the
>> appropriate rows deleted (implemented by constructing a new array with
>> the remaining rows) would seem to be a good idea.
>>
>> I'll place a prototype (named delete) to that effect into SVN soon.
>>
>> -Travis
>>
>>
> Now of course: I often needed to "insert" a column, row or section, ... ?
> I made a quick and dirty implementation for that myself:
> def insert(arr, i, entry, axis=0):
> """returns new array with new element inserted at index i along axis
> if arr.ndim>1 and if entry is scalar it gets filled in (ref. broadcasting)
>
> note: (original) arr does not get affected
> """
> if i > arr.shape[axis]:
> raise IndexError, "index i larger than arr size"
> shape = list(arr.shape)
> shape[axis] += 1
> a= N.empty(dtype=arr.dtype, shape=shape)
> aa=N.transpose(a, [axis]+range(axis)+range(axis+1,a.ndim))
> aarr=N.transpose(arr, [axis]+range(axis)+range(axis+1,arr.ndim))
> aa[:i] = aarr[:i]
> aa[i+1:] = aarr[i:]
> aa[i] = entry
> return a
>
Sure, it makes sense to parallel the delete function.
-Travis
More information about the Numpy-discussion
mailing list