我有一个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()”
如何检查呢?
答案 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
会引起歧义错误。其中包括if
和and/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]