Python Numpy-为什么在尝试删除行时出现NaN值错误

Python Numpy-为什么在尝试删除行时出现NaN值错误,python,arrays,numpy,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: delet

我有一个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;-)

仅仅生成一个新数组是没有选择的

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

看起来您想就地删除数组中的一行,但是,使用
np.delete
函数是不可能的,因为这样的操作违背了Python和Numpy管理内存的方式

我在Numpy邮件列表()上发现了一篇有趣的帖子,其中首先讨论了
np.delete
函数:

因此,“就地”删除数组 对象不会特别重要 有用,因为它只适用于 无附加引用的数组 计数(即简单b=a赋值 将增加引用计数和 使之无法说出dela[obj])

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

如果您查看
np.delete
()的文档,我们可以看到函数返回一个new数组,其中删除了所需的部分(不一定是行)

所以,在你的情况下,我想你会想做一些事情,比如:

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
将指向新内存


我确信有一种更好的矢量化方法(可能使用掩码数组?)来找出要删除的行,但我无法将其组合在一起。如果有人有,尽管请评论

是的,比我的解决方案简单得多!我认为原始海报想要保留
行[0]
li
中的行,需要从列表中删除
而不是
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)