我有一个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; - )
答案 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.delete
(http://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
将指向的新内存。
我确定有更好的矢量化方式(可能使用蒙面数组?)来找出要删除的行,但我无法将它们组合在一起。如果有人有,请发表评论!