Numpy - 为什么尝试删除行时NaN的值错误

时间:2010-10-06 14:06:00

标签: python arrays numpy

我有一个numpy数组:

A = array([['id1', '1', '2', 'NaN'],
           ['id2', '2', '0', 'NaN']])

我也有一个清单:

li = ['id1', 'id3', 'id6']

我希望迭代数组和列表,并且数组每行中的第一个元素不在列表中,然后从数组中删除整行。

我的代码:

from numpy import *

for row in A:
    if row[0] not in li:
        delete(A, row, axis = 0)

这会返回以下错误:

ValueError: invalid literal for int() with base 10: 'NaN'

每一行中所有元素的类型都是str(),因此我不理解错误中提到的int()。

有什么建议吗?

谢谢, S; - )

2 个答案:

答案 0 :(得分:5)

只是生成一个新数组是没有选择的吗?

numpy.array([x for x in A if x[0] in li])

答案 1 :(得分:2)

您似乎要删除数组就地的一行,但是,使用np.delete功能 <}> 操作违背了Python和Numpy管理内存的方式。

我在Numpy邮件列表(Travis Oliphant, [Numpy-discussion] Deleting a row from a matrix)上发现了一篇有趣的帖子,其中首先讨论了np.delete函数:

  

所以,“就地”删除数组   对象不会特别   有用,因为它只适用于   没有额外引用的数组   计数(即简单b =赋值)   会增加引用次数和   无法说del [obj])。

     

...

     

但是,这两个问题都存在   一旦你开始,就是方法   删除任意行(或n-1   来自数组的维度子空间)   你很可能不会再有了   可以描述的大块内存   使用n维阵列存储器   模型。

如果你看一下np.deletehttp://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html)的文档,我们可以看到该函数返回一个带有所需部分的 new 数组(不一定是行) )删除。

Definition:       np.delete(arr, obj, axis=None)
Docstring:
Return a new array with sub-arrays along an axis deleted.

Parameters
----------
arr : array_like
  Input array.
obj : slice, int or array of ints
  Indicate which sub-arrays to remove.
axis : int, optional
  The axis along which to delete the subarray defined by `obj`.
  If `axis` is None, `obj` is applied to the flattened array.

Returns
-------
out : ndarray
    A copy of `arr` with the elements specified by `obj` removed. Note
    that `delete` does not occur in-place. If `axis` is None, `out` is
    a flattened array.

所以,在你的情况下,我认为你会想做类似的事情:

A = array([['id1', '1', '2', 'NaN'],
           ['id2', '2', '0', 'NaN']])

li = ['id1', 'id3', 'id6']

for i, row in enumerate(A):
    if row[0] not in li:
        A = np.delete(A, i, axis=0)

A现在已经按照您的需要减少了,但请记住它是一块新记忆。每次调用np.delete时,都会分配一个名为A将指向的新内存。

我确定有更好的矢量化方式(可能使用蒙面数组?)来找出要删除的行,但我无法将它们组合在一起。如果有人有,请发表评论!