[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

```