[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 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.


More information about the Numpy-discussion mailing list