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

Python 如果数组列表中的数组返回值错误,python,numpy,Python,Numpy,我有一个numpy.array的列表,我正在尝试添加一个检查,看看列表中是否已经存在该数组 比如说 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

我有一个numpy.array的列表,我正在尝试添加一个检查,看看列表中是否已经存在该数组

比如说

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()”


如何检查这一点?

这里有一种方法:

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))

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

这里有一种方法:

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))
也就是说,这首先是一件非常奇怪的事情。

对于列表:

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]
对于阵列,
==
是按元素排列的(带有广播):

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

In [246]: np.all(np.array([3,2,1])==arr,axis=1)
Out[246]: array([False,  True])
和一个
any
来完成
中的

In [252]: np.any(Out[246])
Out[252]: True
当在需要标量True/False的Python上下文中使用多值布尔数组时,
numpy
会引发这种歧义错误。这包括
if
,和
和/或
,以及
测试中的

另一种描述逐行比较的方法:

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]
列表如下:

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]
对于阵列,
==
是按元素排列的(带有广播):

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

In [246]: np.all(np.array([3,2,1])==arr,axis=1)
Out[246]: array([False,  True])
和一个
any
来完成
中的

In [252]: np.any(Out[246])
Out[252]: True
当在需要标量True/False的Python上下文中使用多值布尔数组时,
numpy
会引发这种歧义错误。这包括
if
,和
和/或
,以及
测试中的

另一种描述逐行比较的方法:

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]

不要使用内置关键字
list
作为变量名,除非您正在积极寻找创建bug…
np.array(1,2,3)
将给您另一个值错误,请使用
np.array([1,2,3])
代替。出现问题的原因是
np.array([1,2,3])==np array([x,y,z])
返回一个大小相同的布尔数组-它进行元素级比较。这与产生标量true/false的列表比较形成对比。因此,如果
测试中的
不能很好地使用数组。不要使用内置关键字
列表
作为变量名,除非您正在积极寻找创建bug…
np.array(1,2,3)
会给您另一个值错误,请改用
np.array([1,2,3])
。出现问题的原因是
np array([1,2,3]))==np.array([x,y,z])
返回一个大小相同的布尔数组-它进行元素级比较。这与产生标量true/false的列表比较形成对比。因此,
测试中的
if
不能很好地处理数组。奇怪的是,如果在循环中,数组[2,3,1]会被多次添加到lst。奇怪的是,如果在循环中,数组[2,3,1]会被多次添加到lst。