Numpy,其中()与二维矩阵上的All()

Numpy,其中()与二维矩阵上的All(),numpy,where,Numpy,Where,使用Where函数匹配单个行,我希望匹配整个4x4数组,而不仅仅是单个行 以下是示例结果: (数组([1,97,97,97,97],dtype=int64),数组([0,0,1,2,3],dtype=int64)) 如果所有四行都匹配,结果将包含与上面索引97相同的索引4倍的索引,则一行与索引“1”匹配 我假设如果整个数组都匹配,那么只会返回一个索引。 如果为一个数组提供多个索引,则显示所需输出的示例: (数组([97,97,97,97],dtype=int64),数组([0,1,2,3],dt

使用Where函数匹配单个行,我希望匹配整个4x4数组,而不仅仅是单个行

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

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

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

让我们看一个例子

np.where((A.reshape(A.shape[0],-1) == U[0].reshape(-1)).all(axis=1))
现在,如果我理解正确,您希望在
A
中查找
U[0]
。逐行匹配更容易,因此让我们将
4x4
数组重塑为行

>>> 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]])
现在我们可以将它们与
np进行比较。其中
但是如果我们不小心,我们会得到一个元素级的比较,因此我们需要使用
np。all(axis=1)
确保逐行比较它们:

>>> 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一起使用。所有
都可以避免完全重塑:

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

请包括实际输出和期望输出示例请解释您的答案我觉得奇怪的是似乎只跨行而不跨矩阵工作。@TimT默认情况下它对矩阵工作,
axis
参数是key@TimT查看编辑,您甚至可以使用多个轴并避免重塑形状!好了!轴是我知识中缺失的缺口。我认为我没有在解决方案中看到多个轴。做得好。:)
>>> np.where(np.all(A.reshape(25, -1) == U[0].reshape(-1), axis=1))
(array([0]),)
np.where((A == U[0]).all(axis=(1,2)))