Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assigning identical array indices at once in Python/Numpy

I want to find a fast way (without for loop) in Python to assign reoccuring indices of an array. This is the desired result using a for loop:

import numpy as np
a=np.arange(9, dtype=np.float64).reshape((3,3))
# The array indices: [2,3,4] are identical.
Px = np.uint64(np.array([0,1,1,1,2]))
Py = np.uint64(np.array([0,0,0,0,0]))
# The array to be added at the array indices (may also contain random numbers).
x = np.array([.1,.1,.1,.1,.1])

for m in np.arange(len(x)):
    a[Px[m]][Py[m]] += x

print a
%[[ 0.1  1.  2.]
%[ 3.3  4.  5.]
%[ 6.1  7.  8.]]

When I try to add x to a at the indices Px,Py I obviously do not get the same result (3.3 vs. 3.1):

a[Px,Py] += x
print a
%[[ 0.1  1.  2.]
%[ 3.1  4.  5.]
%[ 6.1  7.  8.]]

Is there a way to do this with numpy? Thanks.

like image 284
Paul Avatar asked Aug 16 '13 12:08

Paul


People also ask

How do you repeat an array in NumPy?

NumPy: repeat() function The repeat() function is used to repeat elements of an array. Input array. The number of repetitions for each element. repeats is broadcasted to fit the shape of the given axis.

How do you equalize two arrays in Python?

Compare Two Arrays in Python Using the numpy. array_equiv() Method. The numpy. array_equiv(a1, a2) method takes array a1 and a2 as input and returns True if both arrays' shape and elements are the same; otherwise, returns False .

How do I assign a NumPy array?

Element Assignment in NumPy Arrays We can assign new values to an element of a NumPy array using the = operator, just like regular python lists. A few examples are below (note that this is all one code block, which means that the element assignments are carried forward from step to step).

How do I combine multiple NumPy arrays?

Use numpy. concatenate() to merge the content of two or multiple arrays into a single array. This function takes several arguments along with the NumPy arrays to concatenate and returns a Numpy array ndarray. Note that this method also takes axis as another argument, when not specified it defaults to 0.


1 Answers

Yes, it can be done, but it is a little tricky:

# convert yourmulti-dim indices to flat indices
flat_idx = np.ravel_multi_index((Px, Py), dims=a.shape)
# extract the unique indices and their position
unique_idx, idx_idx = np.unique(flat_idx, return_inverse=True)
# Aggregate the repeated indices 
deltas = np.bincount(idx_idx, weights=x)
# Sum them to your array
a.flat[unique_idx] += deltas
like image 139
Jaime Avatar answered Sep 28 '22 05:09

Jaime