[英]indexing/slicing in numpy array to modify it
我有一个numpy数组A,我想使用索引列表B修改其中的值。但是,在切片过程中,我可以多次拥有该数组的元素...此示例将更好地解释我的意思。 :
import numpy as np
A = np.arange(5) + 0.5
B = np.array([0, 1, 0, 2, 0, 3, 0, 4])
print A[B]
返回预期的结果[ 0.5 1.5 0.5 2.5 0.5 3.5 0.5 4.5]
。 但是,如果我这样做:
A[B] += 1.
print A
我期望获得[ 4.5 2.5 3.5 4.5 5.5]
因为第一个元素在索引向量B中重复了4次,但返回[ 1.5 2.5 3.5 4.5 5.5]
。 那我该怎么做我想做的事呢? (不使用任何循环,因为我在非常大的阵列上使用它)
解释为什么会发生这种情况有点涉及,但基本上是“缓冲吃了功课”。 解决此问题的numpy ufuncs有几种方法。 适用于任何操作的一种方法是使用相应的ufunc的at
方法 :
>>> A = np.arange(5) + 0.5
>>> B = np.array([0, 1, 0, 2, 0, 3, 0, 4])
>>> np.add.at(A, B, 1)
>>> A
array([ 4.5, 2.5, 3.5, 4.5, 5.5])
这通常有点慢,因此为了获得最快的性能,并且仅用于添加,您可以使用np.bincount
:
>>> A = np.arange(5) + 0.5
>>> A += np.bincount(B) * 1 # replace the 1 with the number you want to add
>>> A
array([ 4.5, 2.5, 3.5, 4.5, 5.5])
编辑
如果要添加的是与B
长度相同的数组,则使用bincount
的以下bincount
可能比第一种方法运行得更快:
>>> A = np.arange(5) + 0.5
>>> C = np.ones_like(B) # They are all ones, but could be anything
>>> A += np.bincount(B, weights=C)
>>> A
array([ 4.5, 2.5, 3.5, 4.5, 5.5])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.