简体   繁体   English

从具有索引的二维矩阵构建 3D boolean 矩阵,在 numpy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM