将带有索引(元组)的二维矩阵转换为二维布尔矩阵(不同形状)-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]]
- 第一行给出的索引是
(0,0) (0,1) (0,3)
,
所以布尔矩阵的第一行是 11010 (1 其中
索引存在,否则为 0)
- 下一行的索引是
(1,0) (1,3) (1,4)
,所以布尔矩阵中的行是 10011
等等……
我写了一个用循环做的函数,附上了。但是执行起来太慢了!我正在寻找更高效的方法,使用 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]]
我正在寻找一种无需循环(使用 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]]
- 第一行给出的索引是
(0,0) (0,1) (0,3)
, 所以布尔矩阵的第一行是 11010 (1 其中 索引存在,否则为 0) - 下一行的索引是
(1,0) (1,3) (1,4)
,所以布尔矩阵中的行是 10011
等等……
我写了一个用循环做的函数,附上了。但是执行起来太慢了!我正在寻找更高效的方法,使用 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]]