Python中的Numpy.Array在列表中的使用?

18
我有一个numpy数组的列表(用作堆栈),现在我想要检查这个列表中是否已经存在一个数组。如果它是元组,例如,我会简单地编写类似于(1,1) in [(1,1),(2,2)]的代码。然而,对于numpy数组,这样做是行不通的;np.array([1,1]) in [np.array([1,1]), np.array([2,2])]会出现一个错误(ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all())。在这里,错误信息并不能帮助我们,因为它指的是直接比较数组。
我很难相信这是不可能的,但我想可能是我遗漏了什么东西。

我很难相信最简单的方法需要2个函数调用和1个列表推导式...这个功能似乎足够常见,值得拥有自己的内置函数。 - Rufus
5个回答

29

使用以下方法检查是否在列表 my_list 中包含与 a 相等的数组:

any((a == x).all() for x in my_list)

我使用了这个,尽管我不得不将它变成列表推导式(np.any([(a == x).all() for x in my_list]))才能让它工作。我的想法是,否则它就是一个生成器?如果my_list为空,则原始返回True。 - carlpett
1
我的回答中的 any() 是 Python 内置的 any(),而不是 numpy.any()。这两个函数是不同的!不要使用 from numpy import * -- 它会覆盖几个 Python 内置函数。 - Sven Marnach
哦,我还没有导入所有的东西,但是我不知道有一个名为any的Python内建函数,所以我认为你说的是numpy.any。对于误解我感到抱歉。 - carlpett
1
最好使用经过优化的numpy内部array_equal()函数。any(np.array_equal(a, x) for x in my_list) - fabianegli
@fabianegli 您的评论让人觉得这个函数可能会更快,但实际上该函数的实现与此答案中的代码基本相同,因此使用该函数只会增加更多的函数调用开销。不过,由于另一个原因,这仍然可能是正确的选择:如果数组具有不兼容的形状,则 == 将抛出异常,而 array_equal()将简单地返回 False,这可能是您想要的,也可能不是。 - Sven Marnach
@SvenMarnach确实。另外:使用==比较不同长度的数组将来会失败:'DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.' - fabianegli

2

如果您想要在堆栈中查找完全相同的数组实例,而不管数据是否相同,那么您需要执行以下操作:

id(a) in map(id, my_list)

2

如果您想比较数组的实际内容,Sven的答案是正确的选择。如果您只想检查列表中是否包含相同的实例,则可以使用

any(a is x for x in mylist)

其中一个好处是:这适用于各种类型的对象。


0

这个怎么样:

a = array([1, 1])

l = [np.array([1,1]), np.array([2,2])]
list(map(lambda x: np.array_equal(x, a), l)

[True, False]

-1
您可以使用 tolist() 将数组转换为列表,然后进行检查:
my_list = [[1,1], [2,2]]

print(np.array([1,1]).tolist() in my_list)
print(np.array([1,2]).tolist() in my_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接