Numpy Where()在2D矩阵上使用All()

时间:2018-05-05 16:15:39

标签: numpy where

A= np.random.randint(5, size=(25, 4, 4))
U= np.unique(A, axis =0 )
results = np.where((A==U[0]).all(axis=-1))

使用此Where函数匹配各行,我想匹配整个4x4数组,而不仅仅是单个行。

以下是示例结果: (array([1,97,97,97,97],dtype = int64),array([0,0,1,2,3],dtype = int64))

如果所有四行匹配,结果将包含与上面索引97相同的索引4次,则单行与索引“1”匹配。

我假设如果整个数组匹配,那么只返回一个索引。 如果为一个数组提供多个索引,则为所需输出的示例: (array([97,97,97,97],dtype = int64),array([0,1,2,3],dtype = int64)

1 个答案:

答案 0 :(得分:0)

np.where((A.reshape(A.shape[0],-1) == U[0].reshape(-1)).all(axis=1))

让我们看一个例子

>>> A = np.random.randint(5, size=(25, 4, 4))
>>> A[:3,...]
array([[[0, 2, 0, 1],
        [1, 0, 3, 0],
        [4, 1, 1, 2],
        [0, 1, 0, 0]],

       [[1, 3, 2, 3],
        [2, 4, 2, 1],
        [3, 3, 2, 3],
        [4, 2, 1, 1]],

       [[4, 0, 3, 3],
        [1, 0, 4, 4],
        [0, 0, 2, 3],
        [4, 1, 2, 2]]])
>>> U = np.unique(A, axis=0)
>>> U[0]
array([[0, 2, 0, 1],
       [1, 0, 3, 0],
       [4, 1, 1, 2],
       [0, 1, 0, 0]])

现在,如果我理解正确,您需要在U[0]中找到A。逐行匹配更容易,所以让我们将4x4数组重新整形为行

>>> A.reshape(A.shape[0], -1)[:3,...]
array([[0, 2, 0, 1, 1, 0, 3, 0, 4, 1, 1, 2, 0, 1, 0, 0],
       [1, 3, 2, 3, 2, 4, 2, 1, 3, 3, 2, 3, 4, 2, 1, 1],
       [4, 0, 3, 3, 1, 0, 4, 4, 0, 0, 2, 3, 4, 1, 2, 2]])
>>> U[0].reshape(-1)
array([0, 2, 0, 1, 1, 0, 3, 0, 4, 1, 1, 2, 0, 1, 0, 0])

现在我们可以将它们与np.where进行比较,但如果我们不小心,我们会进行元素比较,因此我们需要使用np.all(axis=1)来确保逐行比较它们: / p>

>>> np.where(np.all(A.reshape(25, -1) == U[0].reshape(-1), axis=1))
(array([0]),)

编辑我刚刚发现你可以使用np.all多个轴并避免重新整形:

np.where((A == U[0]).all(axis=(1,2)))