[英]Building a 3D boolean matrix from a 2D matrix with indices, in numpy
I have a 2D matrix of shape (3, 4)
with indices ranging from 0 to 8:我有一个形状为
(3, 4)
的二维矩阵,其索引范围为 0 到 8:
a = array([[0, 4, 1, 2],
[5, 0, 2, 3],
[8, 6, 0, 5]])
Currently, I use a for
loop to build a 3D boolean array of shape (9, 3, 4)
that stores True
at the position of each index, for each row between 0 and 8:目前,我使用
for
循环来构建一个 3D boolean 形状数组(9, 3, 4)
,该数组在每个索引的 position 处存储True
,对于 0 到 8 之间的每一行:
b = np.zeros((9, 3, 4), dtype=bool)
for i in range(9):
b[i] = np.where(a == i, True, False)
Is there a way to achieve the same result without iteration, perhaps using numpy functions?有没有办法在没有迭代的情况下达到相同的结果,也许使用 numpy 函数?
Is this something you're looking for?这是你要找的东西吗?
import numpy as np
a = np.array([[0, 4, 1, 2],
[5, 0, 2, 3],
[8, 6, 0, 5]])
y, x = np.mgrid[0:a.shape[0], 0:a.shape[1]]
data = np.zeros((9,) + a.shape, dtype=bool)
data[a, y, x] = True
A very short solution that takes advantage of numpy broadcasting:一个利用 numpy 广播的非常短的解决方案:
b = np.array([a]*9) == np.arange(9).reshape(-1,1,1)
Output: Output:
>>> b
array([[[ True, False, False, False],
[False, True, False, False],
[False, False, True, False]],
[[False, False, True, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, True],
[False, False, True, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, True],
[False, False, False, False]],
[[False, True, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[ True, False, False, False],
[False, False, False, True]],
[[False, False, False, False],
[False, False, False, False],
[False, True, False, False]],
[[False, False, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False],
[False, False, False, False]]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.