【问题标题】:How to accumulate an array by index in numpy? [duplicate]如何在numpy中按索引累积数组? [复制]
【发布时间】:2016-10-27 18:18:05
【问题描述】:

我有一个数组:

a = np.array([0,0,0,0,0,0])

我想在 a 的每个索引中添加一些其他数组,而索引可以出现多次。我想获得每个索引的一些。我写:

a[np.array([1,2,2,1,3])] += np.array([1,1,1,1,1])

但得到一个:

array([0, 1, 1, 1, 0, 0])

但我想要的是得到:

array([0, 2, 2, 1, 0, 0])

如何在没有 for 循环的情况下在 numpy 中实现这一点?

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    使用纯 numpy,并避免 for 循环:

    np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1]))
    

    输出:

    >>> a = np.array([0,0,0,0,0,0])
    >>> np.add.at(a, np.array([1,2,2,1,3]), np.array([1,1,1,1,1]))
    >>> a
    array([0, 2, 2, 1, 0, 0])
    

    请注意,这会进行就地替换。这是你想要的,但未来的观众可能并不想要。因此注释:)

    【讨论】:

    • 太棒了。我什至查看了np.add.reduceat,但我没有花太多时间使用ufunc 方法,所以我不知道其中的大部分。这里的documentation 就更完美了……“对于加法ufunc,这个方法等价于a[indices] += b,只不过对多次索引的元素累加结果”
    • 谢谢,这正是我想要的。
    【解决方案2】:

    您可以执行以下操作(假设每个索引都有一个相关值):

    a = np.array([0,0,0,0,0,0])
    idxs = np.array([1,2,2,1,3])
    vals = np.array([1,1,1,1,1])
    for idx, val in zip(idxs,vals):
        a[idx] += val
    

    【讨论】:

      【解决方案3】:

      我不知道一个聪明的 numpy 矢量化方法来做到这一点......我能想到的最好的方法是:

      >>> indices = np.array([1,2,2,1,3])
      >>> values = np.array([1,1,1,1,1])
      >>> a = np.array([0,0,0,0,0,0])
      >>> for i, ix in enumerate(indices):
      ...   a[ix] += values[i]
      ... 
      >>> a
      array([0, 2, 2, 1, 0, 0])
      

      【讨论】:

      • 谢谢,但我想避免 for 循环。
      • @maple -- 我明白这一点,但我不知道有什么办法。当然,这并不是说 没有 方法可以做到(尽管可能没有)。无论如何,有时有一个正确(工作)代码的示例足以说明问题,以便其他人更好地解决它。
      • @maple 如果您想知道一种方法,请查看我的答案。谢谢。虽然我完全同意给出以不同方式解决问题的例子。
      【解决方案4】:

      你总是可以自己迭代。比如:

      for i in [1,2,2,1,3]:
          a[i] += 1
      

      【讨论】:

      • 谢谢,但我想避免 for 循环。
      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2017-04-02
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      相关资源
      最近更新 更多