创建一个布尔数组,将 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]]])
我们的想法是让 X
和 test
的维度匹配,这样我们就可以广播相等比较,所以 test
的第一项与第一个子项进行比较X
的矩阵,第二项与第二个子矩阵比较,依此类推。
假设我有一个 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]]])
我们的想法是让 X
和 test
的维度匹配,这样我们就可以广播相等比较,所以 test
的第一项与第一个子项进行比较X
的矩阵,第二项与第二个子矩阵比较,依此类推。