正如@jotasi所指出的那样,由于数组内的逐元素比较,真值是不确定的。此前有一个关于这个问题的答案在这里。总体而言,您可以通过以下各种方式完成任务:
- 列表转数组:
您可以将列表转换为(3,3,3)形状的数组,然后使用“in”运算符,如下所示:
>>> a = [np.random.rand(3, 3), np.random.rand(3, 3), np.random.rand(3, 3)]
>>> a= np.asarray(a)
>>> b= a[1].copy()
>>> b in a
True
np.all:
>>> any(np.all((b==a),axis=(1,2)))
True
list-comperhension:
This done by iterating over each array:
>>> any([(b == a_s).all() for a_s in a])
True
以下是上述三种方法的速度比较:
速度比较
import numpy as np
import perfplot
perfplot.show(
setup=lambda n: np.asarray([np.random.rand(3*3).reshape(3,3) for i in range(n)]),
kernels=[
lambda a: a[-1] in a,
lambda a: any(np.all((a[-1]==a),axis=(1,2))),
lambda a: any([(a[-1] == a_s).all() for a_s in a])
],
labels=[
'in', 'np.all', 'list_comperhension'
],
n_range=[2**k for k in range(1,20)],
xlabel='Array size',
logx=True,
logy=True,
)
a
定义为一个3x3x3
的数组? - Nils Werner