将带有索引(元组)的二维矩阵转换为二维布尔矩阵(不同形状)-NumPy

Turn 2D matrix with indexes (tuples) to 2D Boolean matrix (in different shape) - NumPy

我正在寻找一种无需循环(使用 NumPy)即可将索引矩阵转换为布尔矩阵的有效方法。

索引矩阵由表示索引的元组构建。我需要从中构建一个布尔矩阵(不同且已知大小),它在索引矩阵中的所有索引上变为“1”,在所有其他位置变为“0”。例如,如果 x 形状为 (5, 3, 2) 的数组为:

x = np.array([[[0, 0], [0, 1], [0, 3]],
              [[1, 0], [1, 3], [1, 4]],
              [[2, 2], [2, 3], [2, 4]],
              [[3, 1], [3, 3], [3, 4]],
              [[4, 2], [4, 3], [4, 4]]])

所需的输出形状为 (5, 5) 为:

[[1 1 0 1 0]
 [1 0 0 1 1]
 [0 0 1 1 1]
 [0 1 0 1 1]
 [0 0 1 1 1]]

我写了一个用循环做的函数,附上了。但是执行起来太慢了!我正在寻找更高效的方法,使用 NumPy。

感谢大家的帮助!!

可以使用索引从 x 获取行和列 ID 数组。然后我们可以创建一个具有所需形状的零 NumPy 数组;其中,最大列号可以取自 x,行号将与 x:

相同
row_ids  = x[:, :, 0]
# [[0 0 0]
#  [1 1 1]
#  [2 2 2]
#  [3 3 3]
#  [4 4 4]]

cols_ids = x[:, :, 1]
# [[0 1 3]
#  [0 3 4]
#  [2 3 4]
#  [1 3 4]
#  [2 3 4]]

B = np.zeros((x.shape[0], x.max() + 1), dtype=np.int64)
# [[0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]]

现在,我们可以通过 1 使用索引填充 B 数组:

B[row_ids, cols_ids] = 1
#  [[1 1 0 1 0]
#   [1 0 0 1 1]
#   [0 0 1 1 1]
#   [0 1 0 1 1]
#   [0 0 1 1 1]]