检查列表(numpy 数组)中的所有项目是否相等

Checking that all items in a list (numpy arrays) are equal

我的程序中有一个函数需要检查并确保列表中的所有项目(都是 numpy 数组)都相等。执行此操作的 if 语句以

开头
if np.array_equal(qstatnum[gatnum].count(qstatnum[gatnum][0]), len(qstatnum[gatnum])) == True:

这一行报错

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我不确定是什么问题。任何帮助,将不胜感激。谢谢!


编辑: 根据请求,代码中的完整 if-else 语句

if np.array_equal(qstatnum[gatnum].count(qstatnum[gatnum][0]), len(qstatnum[gatnum])) == True:
    if np.array_equal(qstatnum[gatnum][0], [0,1]) == True:
        return qstat
    elif np.array_equal(qstatnum[gatnum][0], [1,0]) == True:
        return singates[typegat2](qstat)
    else:
        print("superposition not yet implemented")
else:
    return qstat

很抱歉没有包括在内,正在努力使问题尽可能小。

您似乎没有正确使用 array_equalarray_equal 的输入必须是数组,而你似乎正在传递 len 的东西,这是一个数字...

如果 l1l2 是您的两个数组列表,您可能正在寻找类似的内容:

if all(np.array_equal(i, j) for i, j in zip(l1, l2)):
    # Do something

例如,

>>> l1 = [np.arange(3), np.arange(5)]
>>> l2 = [np.r_[0:3], np.r_[0:5]]
>>> if all(np.array_equal(i, j) for i, j in zip(l1, l2)):
...     print('yes')
...     
yes

编辑

如果你想证明列表中的所有数组都彼此相等,那么你可以只证明所有数组都等于第一个:

l = [np.arange(3), np.arange(3), np.arange(3)]
if all(np.array_equal(i, l[0]) for i in l[1:]):
    print('All equal!')

不幸的是,我没有 numpy,但这是我检查列表中的所有项目是否相等的方法。

for i in range(len(arr)):
for j in range(i+1, len(arr)):
    if arr[i] != arr[j]:
        print ("items are not all equal");

希望对您有所帮助。

正如@Praveen 已经提到的,您似乎只想比较两个数字!如果是这种情况,那么您不需要使用 numpy.array_equal().

由于您没有提供代码,因此我无法解释为什么会出现此错误。但我在这里分享一个简单的让你知道错误的意思。

示例:

x = np.arange(0, 2, 0.5)
print(x) # [ 0.   0.5  1.   1.5]
y = 2*x
print(y) # [ 0.  1.  2.  3.]

if y <= 1.0:
    print ("ok") 

这个程序报错如下。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如果打印布尔表达式的值:

print(y<=1.0)

它打印-

[True True False False]

因此,按如下方式更新 if 条件使程序运行。

if np.all(y <= 1.0):
    print ("ok")

所以,我想,您也可以这样做来解决您的问题。

if np.all(np.array_equal(qstatnum[gatnum].count(qstatnum[gatnum][0]), len(qstatnum[gatnum]))) == True: