使用带有冗余元素的python数组索引python数组

时间:2011-08-02 14:50:37

标签: python arrays indexing numpy scipy

我遇到了数组索引的问题。假设您有一个数组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的错误吗? 提前致谢

3 个答案:

答案 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.])