在numpy数组中索引/切片以修改它

时间:2015-01-29 01:15:51

标签: python numpy indexing slice

我有一个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]。 那么我该怎样做我真正想做的事情呢? (不使用任何循环,因为我在非常大的数组上使用它)

1 个答案:

答案 0 :(得分:2)

解释为什么会发生这种情况有点牵扯,但基本上,“缓慢吃掉你的作业。”这个numpy ufuncs问题有几种解决方法。适用于任何操作的合适的一个是使用相应的ufunc的at method

>>> 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的以下内容可能比第一种方法运行得更快:

>>> 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])