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