我想知道在内部"子阵列"的比较结果中获得布尔数组的最佳方法是什么?和一个维数较少的数组。例如,给定:
a = array([[[[-1, -1], [-1, 1]],
[[-1, -1], [ 1, 1]]],
[[[ 0, -1], [ 1, 1]],
[[ 0, 1], [-1, -1]]]])
a.shape == (n, m, k, l)
和
b = [-1, -1]
b.shape == (l,)
我想得到:
c = array([[[True, False],
[True, False]],
[[False, False],
[False, True]]])
c.shape == (n, m, k)
但是,一般来说我们可以想象:
b.shape == (k, l)
c.shape == (n, m)
答案 0 :(得分:3)
由于a
和b
的最后维度匹配,表达式a == b
将正确广播到大小为a
的布尔数组。
由于您想知道子阵列的所有元素是否匹配,您可以使用np.all(a == b, axis=-1)
缩小最后一个维度。
对于b
是多维的情况,您必须将最后的维度拉为一,因为np.all
尚未接受适当的维度序列。像shp = a.shape[:-b.ndim] + (b.size,); np.all((a == b).reshape(shp), axis=-1)
这样的东西应该适用于一般情况。
<强>更新强>
显然np.all
支持一个轴元组作为axis
参数已经有一段时间了。然后,一般情况显着简化为np.all(a == b, axis=tuple(range(-b.ndim, 0)))
。这也适用于1D的情况。
答案 1 :(得分:2)
尝试:
logical_and.reduce(a == b, axis = -1)
由于b
的形状与a
的最后一个维度匹配,它将自动广播,因此您可以直接应用==
运算符,该运算符将逐点比较返回相同的逻辑数组形状为a
。 reduce操作返回True为所有&#34;行&#34;仅包含True值(将ndim
减少一个)
第二个例子(请务必注意axis
参数的不同之处):
>>> b = [[-1,-1],[-1,1]]
>>> logical_and.reduce(a == b, axis = (-2,-1))
array([[ True, False],
[False, False]], dtype=bool)