繁体   English   中英

索引/切片在numpy数组中进行修改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM