如果数组列表中的数组返回值错误

时间:2018-10-22 04:34:38

标签: python numpy

我有一个numpy.arrays列表,我试图添加一个检查列表中是否已经存在该数组。

例如

list = []
list.append( np.array( 1, 2, 3) )
list.append( np.array( 3, 2, 1) )

if not np.array( 2, 3, 1) in list:
    list.append( np.array( 2, 3, 1) )

我遇到错误

  

“ ValueError:具有多个元素的数组的真值不明确。请使用a.any()或a.all()”

如何检查呢?

2 个答案:

答案 0 :(得分:2)

这里是一种方法:

lst = []
lst.append(np.array(1, 2, 3))
lst.append(np.array(3, 2, 1))

# pretty ugly solution, admittedly
if not any(np.logical_not(np.any(
    np.array(lst) != np.array(2, 3, 1), axis=0))):
    lst.append(np.array(2, 3, 1))

如果lst中数组的大小/类型有所不同,则可能会更好:

if not any(not np.any(x != np.array(2, 3, 1)) for x in lst):
    lst.append(np.array(2, 3, 1))

也就是说,这首先是一件很奇怪的事情。

答案 1 :(得分:0)

带有列表:

In [240]: alist = [[1,2,3], [3,2,1]]
In [241]: [2,3,1] in alist
Out[241]: False
In [242]: [3,2,1] in alist
Out[242]: True
In [243]: [x == [3,2,1] for x in alist]
Out[243]: [False, True]

对于数组,==是逐元素的(对于广播):

In [244]: arr = np.array([[1,2,3],[3,2,1]])
In [245]: np.array([3,2,1])==arr
Out[245]: 
array([[False,  True, False],
       [ True,  True,  True]])

我们可以使用all(或any)减少一个或另一个轴:

In [246]: np.all(np.array([3,2,1])==arr,axis=1)
Out[246]: array([False,  True])

和一个any来完成in

In [252]: np.any(Out[246])
Out[252]: True

在需要标量True / False的Python上下文中使用多值布尔数组时,numpy会引起歧义错误。其中包括ifand/or,以及in测试。

另一种描述行比较的方式:

In [247]: [np.array([3,2,1])==x for x in arr]
Out[247]: [array([False,  True, False]), array([ True,  True,  True])]
In [248]: [np.all(np.array([3,2,1])==x) for x in arr]
Out[248]: [False, True]