【问题标题】:Numpy accumulating one array in another using index arrayNumpy使用索引数组在另一个数组中累积一个数组
【发布时间】:2012-03-20 16:04:33
【问题描述】:

我的问题是关于我想使用 numpy 表达的特定数组操作。

我有一个浮点数组w 和一个与w 长度相同的索引数组idx,我想用相同的idx 值总结所有w 并将它们收集在一个数组v。 作为一个循环,它看起来像这样:

for i, x in enumerate(w):
     v[idx[i]] += x

有没有办法通过数组操作来做到这一点? 我的猜测是 v[idx] += w 但这不起作用,因为 idx 多次包含相同的索引。

谢谢!

【问题讨论】:

  • atomic 确实是对您想要做的事情的不恰当描述。
  • 你会如何描述它?希望新标题更好。
  • @Constantinius,他接受了除了他提出的一个问题之外的所有问题的答案,其中一个回答虽然很好,但并没有解决他的实际问题。也许应该努力避免引起人们对本网站游戏方面的关注。
  • 我喜欢新的描述,好多了。 Atomic 通常在多线程编程的上下文中被提及,因此问题标题具有误导性。
  • @MikeGraham 我接受了一些很好的答案作为对他评论的回应。

标签: python arrays numpy


【解决方案1】:

numpy.bincount 就是为此目的引入的:

tmp = np.bincount(idx, w)
v[:len(tmp)] += tmp

我认为从 1.6 开始,您还可以将 minlength 传递给 bincount

【讨论】:

  • 我知道 bincount 但我不知道它可以处理重量!太棒了:)
  • 请在剩下的时间里尽情享受我的英雄 :)
【解决方案2】:

这是一种已知的行为,虽然有点不幸,但没有 numpy 级别的解决方法。 (如果你扭动它的手臂,bincount 可以用来做这个。)自己做循环真的是你最好的选择。

请注意,如果不重新使用名称 w 并且不引入另一组索引,您的代码可能会更清晰一些,例如

for i, w_thing in zip(idx, w):
    v[i] += w_thing

如果您需要加快这个循环,您可能不得不降级到 C。Cython 使这相对容易。

【讨论】:

  • 更简单:for i in idx: v[i] += w[i].
  • 如果没有索引,这应该可以工作,对吧?您发布的代码只是v + w,对吗? (如果vw 长,则只使用第一个len(w) 元素。重用w 是一个非常糟糕的错字,抱歉。
  • @AndreasMueller,对不起,我打错了。
  • @larsmans,我的代码 sn-p 中有一个错字,我已修复。该代码与 OP 的代码不同。
猜你喜欢
  • 2016-03-09
  • 2020-06-11
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多