通过高级 indexing/vectorizing 更新矩阵
Update a matrix through advanced indexing/vectorizing
我有一个有效反击的矩阵。我想根据列索引列表增加这些计数器 - 每个位置索引也对应于行增量。
这对于 for 循环来说很简单,而对于列表推导式则不那么直接。在任何一种情况下,都涉及迭代。但我想知道是否有任何方法可以向量化这个问题?
最小的问题是:
counters = np.zeros((4,4))
counters
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
update_columns = [1,0,2,2]
for row, col in zip(range(len(update_columns)), update_columns):
counters[row, col] += 1
counters
array([[0., 1., 0., 0.],
[1., 0., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 1., 0.]])
您正在寻找的是高级 numpy 索引。您可以使用 np.arange
传递行索引,使用 update_columns
:
传递列索引
update_columns = np.array(update_columns)
counters[np.arange(update_columns.size), update_columns] += 1
输出:
[[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 1. 0.]]
我有一个有效反击的矩阵。我想根据列索引列表增加这些计数器 - 每个位置索引也对应于行增量。
这对于 for 循环来说很简单,而对于列表推导式则不那么直接。在任何一种情况下,都涉及迭代。但我想知道是否有任何方法可以向量化这个问题?
最小的问题是:
counters = np.zeros((4,4))
counters
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
update_columns = [1,0,2,2]
for row, col in zip(range(len(update_columns)), update_columns):
counters[row, col] += 1
counters
array([[0., 1., 0., 0.],
[1., 0., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 1., 0.]])
您正在寻找的是高级 numpy 索引。您可以使用 np.arange
传递行索引,使用 update_columns
:
update_columns = np.array(update_columns)
counters[np.arange(update_columns.size), update_columns] += 1
输出:
[[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 1. 0.]]