【问题标题】:Add 1 to numpy array from a list of indices? [duplicate]从索引列表中将 1 添加到 numpy 数组? [复制]
【发布时间】:2021-05-24 15:45:02
【问题描述】:

我有一个类似 numpy 的数组

x = np.zeros(4, dtype=np.int)

我有一个像 [1, 2, 3, 2, 1] 这样的索引列表,我想将 1 添加到相应的数组元素中,这样对于索引列表中的每个元素,x 在该位置递增:

x = [0, 2, 2, 1]

我尝试使用:

x[indices] += 1

但是由于某种原因,它只更新索引一次,如果索引出现的频率超过一次,它就没有注册。我当然可以创建一个简单的 for 循环,但我想知道是否有单行解决方案。

【问题讨论】:

  • x 被定义为长度为 3,但您稍后将其引用为具有 4 个元素。
  • x 是任意的,仅作为示例,简单错误:)
  • 这能回答你的问题吗? Increment Numpy array with repeated indices
  • 该链接包含一个使用add.at 的答案,该答案用于解决+= 中的缓冲问题。

标签: python numpy


【解决方案1】:

根据你的问题,你真的可以写

import numpy as np 
indices = [1, 2, 3, 2, 1]
x = np.array([indices.count(i) for i in range(4)])

因为count 计算重复元素。但完整的解决方案是

import numpy as np 
x = np.zeros(4, dtype=np.int)
indices = [1, 2, 3, 2, 1]
result = np.array([indices.count(i) for i in range(4)])
x += result

【讨论】:

    【解决方案2】:

    您可以使用unique 并将return_counts 设置为True

    idx, cnt = np.unique(indices, return_counts=True)
    x[idx] += cnt
    

    【讨论】:

    • 从技术上讲,这与np.bincount 相同,正如我在回答中所展示的那样。您正在用它们的频率计数替换索引。
    • @AkshaySehgal 是的,但问题不是获取每个索引的出现次数,而是将 1 添加到索引列表的给定数组中。所以在我看来你回答了一个不同的问题(也许 OP 有这个想法,但至少他没有这样提出问题)
    • 实际上,即使您的代码也不会增量添加任何内容。 += 是不必要的,因为您没有重复添加。当您使用x[idx] = cnt 时,会获得相同的结果。所以从技术上讲,你也只是索引数组,然后用它的计数替换它,就像np.bincount 所做的那样。
    • @AkshaySehgal 你需要+= OP 写的“x 是任意的,仅作为示例选择”
    • 我不这么认为,因为 OP 说他们的数组是零。但这可能是您提到的情况。无论如何,你的答案是一个足够好的解决问题的方法。
    【解决方案3】:

    您实际上要做的是用它们的频率替换索引。

    试试np.bincount。从技术上讲,这与您尝试做的事情相同。

    indices = [1, 2, 3, 2, 1]
    
    np.bincount(indices)
    
    array([0, 2, 2, 1])
    

    如果你想想你在做什么。你是说对于索引 0,你不想计算任何东西。但是对于索引 1,您需要 2 个计数,.. 等等。希望这能让您直观地了解为什么会这样。

    @Stef 使用np.unique 的解决方案与np.bincount 所做的完全一样。

    【讨论】:

    • 我的解决方案不仅获取出现次数,还将它们添加到给定的数组 x 中。如果您想对bincount 执行相同操作,请查看链接的重复问题stackoverflow.com/a/2004468/3944322。 (我承认 bincount 更快)
    • 它没有,您的解决方案中的 += 是不必要的,您只是将索引 x 数组替换为其相应的计数。 x[idx] = cnt 也可以达到同样的效果。 += 的好处是当您重复更新值时,您不是。所以基本上你的答案和我的完全一样,就是“用它们的频率计数替换索引:”
    【解决方案4】:

    你想要np.add.at:

    np.add.at(x, indices, 1)
    x
    Out[]:
    array([0, 2, 2, 1])
    

    即使x 开始时不是np.zeros,这也有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多