比较numpy中的子阵列

时间:2017-02-10 01:40:16

标签: python numpy

我想知道在内部"子阵列"的比较结果中获得布尔数组的最佳方法是什么?和一个维数较少的数组。例如,给定:

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) 

2 个答案:

答案 0 :(得分:3)

由于ab的最后维度匹配,表达式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)