Индексирование массива python массивом python с избыточными элементами - PullRequest
4 голосов
/ 02 августа 2011

У меня проблема с индексацией массива.Предположим, у вас есть массив 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 не имеет избыточностей (все значения его элементов различны).У кого-нибудь есть решение для такой проблемы, которое избегает использования для циклов?Это ошибка в NumPy?Заранее спасибо

Ответы [ 3 ]

7 голосов
/ 02 августа 2011

Когда вы используете целочисленный массив для индексации другого массива, 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), затем выполнит операцию.на этих элементах один раз .

2 голосов
/ 03 августа 2011

или вы можете использовать bincount ():

a=numpy.zeros(5)
idx = numpy.bincount([0,0,0,1,1,3,3])
a[:len(idx)]+=idx
1 голос
/ 02 августа 2011

Вы можете попробовать:

a += numpy.histogram(b, numpy.arange(len(a)+1))[0]

Это вернет a = array([ 0., 2., 0., 0., 0.])

...