我想要一个布尔numpy数组fixidx
,它是比较numpy数组a
,b
,c
和d
的结果。例如我有数组
a = np.array([1, 1])
b = np.array([1, 2])
c = np.array([1, 3])
d = np.array([1, 4])
因此数组fixidx
具有值
fixidx = [1,0]
我的方法是
fixidx = (a == b) & (b == c) & (c == d)
这在Matlab中有效,但事实证明Python仅输出ValueError。
ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()
any
或all
不会解决这个问题,或者至少我无法弄清楚。
答案 0 :(得分:1)
代码完美无误。尝试将布尔输出转换为整数:
((a == b) & (b == c) & (c == d)).astype(int)
array([1, 0])
答案 1 :(得分:1)
让我们开始将a
,b
,c
和d
堆叠到单个数组x
中:
In [452]: x = np.stack([a, b, c, d])
In [453]: x
Out[453]:
array([[1, 1],
[1, 2],
[1, 3],
[1, 4]])
然后,您可以将NumPy的unique应用于每一列,并测试结果是否包含一个或多个元素。
In [454]: fixidx = np.array([np.unique(x[:, i]).size == 1 for i in range(x.shape[1])])
In [455]: fixidx
Out[455]: array([ True, False])
最后,如有必要,可以将fixidx
转换为整数:
In [456]: fixidx.astype(int)
Out[456]: array([1, 0])
或者,您可以通过NumPy的equal获得相同的结果,如下所示:
fixidx = np.ones(shape=a.shape, dtype=int)
x = [a, b, c, d]
for first, second in zip(x[:-1], x[1:]):
fixidx *= np.equal(first, second)