检查列表(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_equal
。 array_equal
的输入必须是数组,而你似乎正在传递 len
的东西,这是一个数字...
如果 l1
和 l2
是您的两个数组列表,您可能正在寻找类似的内容:
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:
我的程序中有一个函数需要检查并确保列表中的所有项目(都是 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_equal
。 array_equal
的输入必须是数组,而你似乎正在传递 len
的东西,这是一个数字...
如果 l1
和 l2
是您的两个数组列表,您可能正在寻找类似的内容:
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: