indexing/slicing 在 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]
returns 符合预期 [ 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 次,但它 returns [ 1.5 2.5 3.5 4.5 5.5]
。
那么我怎样才能做我真正想做的事情呢? (没有使用任何循环,因为我在非常大的阵列上使用它)
为什么会发生这种情况的解释有点复杂,但基本上,"buffering ate your homework."有几种方法可以解决这个 numpy ufunc 问题。适用于任何操作的正确方法是使用相应的 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])
我有一个 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]
returns 符合预期 [ 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 次,但它 returns [ 1.5 2.5 3.5 4.5 5.5]
。
那么我怎样才能做我真正想做的事情呢? (没有使用任何循环,因为我在非常大的阵列上使用它)
为什么会发生这种情况的解释有点复杂,但基本上,"buffering ate your homework."有几种方法可以解决这个 numpy ufunc 问题。适用于任何操作的正确方法是使用相应的 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])