Python 通过高级索引/矢量化更新矩阵

Python 通过高级索引/矢量化更新矩阵,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,我有一个什么是有效计数器矩阵。我想根据列索引列表增加这些计数器,每个位置索引也对应于行增量 对于for循环来说这很简单,而对于列表理解来说就不那么简单了。无论哪种情况,都涉及到迭代。但我想知道是否有任何方法可以将这个问题矢量化 最小的问题是: counters = np.zeros((4,4)) counters array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 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\u 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.]]