【问题标题】:Numpy arrays assignment operations indexed with arrays用数组索引的 Numpy 数组赋值操作
【发布时间】:2014-01-15 07:18:51
【问题描述】:

我有一个数组y,其索引值必须递增一个在另一个数组x 就像x[y] += 1,这是一个例子:

>>> x = np.zeros(5,dtype=np.int)
>>> y = np.array([1,4])
>>> x
array([0, 0, 0, 0, 0])
>>> x[y] += 1
>>> x
array([0, 1, 0, 0, 1])

到目前为止一切顺利,但后来我遇到了这个问题:

>>> x
array([0, 1, 0, 0, 1])
>>> y = np.array([1,1])
>>> x
array([0, 1, 0, 0, 1])
>>> x[y] += 1
>>> x
array([0, 2, 0, 0, 1])

我期待xarray([0, 3, 0, 0, 1])x[1] 应该加一两次, 但我得到了它,x[1] 只增加了 1。

我该怎么做?为什么会这样?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:
    x[y] += 1
    

    等价于

    x[y] = x[y] + 1
    x[y]+1
    # array([2, 2])
    

    numpy 有效地并行而不是顺序地对术语进行操作。

    x[y]=[4,3]  # or
    x[y] += [4,3]
    

    建议如果为同一术语分配不同的值,则它是最后一个有效的操作(但这可能无法保证)。


    np.add.at(x,y,1)
    

    做你期望的。

    来自np.add.at 的文档:

    对于添加ufunc,这个方法相当于 a[indices] += b,除了为满足以下条件的元素累积结果 被索引不止一次。例如,a[[0,0]] += 1 只会 由于缓冲,第一个元素递增一次,而 add.at(a, [0,0], 1) 将使第一个元素增加两次。

    【讨论】:

      【解决方案2】:

      这样做:

      >>> x=np.array([0, 0, 0, 0, 0])
      >>> y=np.array([1,4])
      >>> x+=np.bincount(y, minlength=x.size)
      >>> x
      array([0, 1, 0, 0, 1])
      >>> y=np.array([1,1])
      >>> x+=np.bincount(y, minlength=x.size)
      >>> x
      array([0, 3, 0, 0, 1])
      >>> map(id, x[y])
      [20481944, 20481944]
      

      x[1,1] 只引用同一个元素,+1 因此只作用于一个元素。

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 2021-12-17
        • 2015-06-16
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多