创建一个布尔数组,将 Numpy 张量中的每个矩阵与 Numpy 数组中的不同整数进行比较

Create a boolean array comparing each matrix in a Numpy tensor to a different integer in a Numpy Array

假设我有一个 3*3*3 的 Numpy 张量 X(实际尺寸会有所不同)。我想针对一组整数中的不同值测试张量中的每个矩阵。

例如如果

X=np.array([1,2,3]*9).reshape(3,3,3)
test=np.array([1,2,3])

所需的输出为:

 [[[ True, False, False],
    [True, False, False],
    [True, False, False]],

   [[False,  True, False],
    [False,  True, False],
    [False,  True, False]],

   [[False, False,  True],
    [False, False,  True],
    [False, False,  True]]])

但是我似乎得不到这个结果。 X==测试returns:

array([[[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]]])

如果

test=[[1],[2],[3]] 

我得到:

array([[[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]]])

同样的结果也适用于 np.equal。有没有不使用任何循环的直接方法来做到这一点?似乎有一种方法可以使用索引

X[[0,1,2],[0,2,1]] 

会产生

np.array([X[0][0],X[1][2],X[2][1]])

而不是

X[:,[0,2,1]]

这是一个简单的相等比较,但棘手的部分是弄清楚如何广播该操作。你可以这样做,

X == test[:, None, None]

array([[[ True, False, False],
        [ True, False, False],
        [ True, False, False]],

       [[False,  True, False],
        [False,  True, False],
        [False,  True, False]],

       [[False, False,  True],
        [False, False,  True],
        [False, False,  True]]])

其中,

test[:, None, None]

array([[[1]],

       [[2]],

       [[3]]])

我们的想法是让 Xtest 的维度匹配,这样我们就可以广播相等比较,所以 test 的第一项与第一个子项进行比较X的矩阵,第二项与第二个子矩阵比较,依此类推。