我遇到了数组索引的问题。假设您有一个数组a和另一个数组b,您想将其用作a的索引,以便为b元素指向的位置指定一些值。
a=numpy.zeros(5)
print a
[ 0. 0. 0. 0. 0.]
现在我想两次增加第二个元素
b=numpy.array([1,1])
a[b]+=1.
print a
[ 0. 1. 0. 0. 0.]
虽然我希望有
[ 0. 2. 0. 0. 0.]
如果数组b没有冗余(其元素的所有值都不同),则没有问题。 有人为这样的问题找到了解决方案,避免使用for循环吗?这是一个numpy的错误吗? 提前致谢
答案 0 :(得分:7)
当您使用整数数组索引另一个数组时,NumPy无法创建足够的视图,因为生成的数组可能无法用步幅表示。因此,它将返回一份副本:
>>> a = np.zeros(5)
>>> b = np.array([1, 1])
>>> c = a[b]
>>> c
array([ 0., 0.])
>>> c.base is a
False
将此索引与+=
等就地操作一起使用时,NumPy会以不同的方式解释它。而不是“遍历索引数组并依次对每个元素执行操作”,它将首先选择由b
索引的所有值(在这种情况下,只有一个索引为1
的元素),然后对这些元素执行一次。
答案 1 :(得分:2)
或者您可以使用bincount():
a=numpy.zeros(5)
idx = numpy.bincount([0,0,0,1,1,3,3])
a[:len(idx)]+=idx
答案 2 :(得分:1)
您可以尝试:
a += numpy.histogram(b, numpy.arange(len(a)+1))[0]
这将返回a = array([ 0., 2., 0., 0., 0.])