【问题标题】:Update a matrix through advanced indexing/vectorizing通过高级索引/矢量化更新矩阵
【发布时间】:2020-09-02 22:16:01
【问题描述】:

我有一个有效计数器的矩阵。我想根据列索引列表增加这些计数器 - 每个位置索引也对应于行增量。

这对于 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.]])

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    您正在寻找的东西称为高级 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.]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多