Home > OS >  Update 2D numpy array using pairs of indices without iteration
Update 2D numpy array using pairs of indices without iteration

Time:11-12

Reproducible setup

I have an array of n pairs of indices:

indexarray=\
np.array([[0,2,4,6],
          [1,3,5,7]])

I also have a 2D array:

zeros = np.zeros((10,9))

and a list of n values:

values = [1,2,3,4]

I would like to add each kth element from the values list to the element in the zeros list having indeces equal to the kth indices pair

A solution

# works, but for loop is not suitable for real-world use-case
for index, (row, col) in enumerate(indexarray.T):
    zeros[row, col] = values[index]

Visualize what I get:

plt.imshow(zeros)

enter image description here

Results as expected.

How can I do this without iteration?


Similar but different questions:

CodePudding user response:

Simply use:

import numpy as np

indexarray = np.array([[0, 2, 4, 6],
                       [1, 3, 5, 7]])
values = [1, 2, 3, 4]

rows, cols = indexarray[0], indexarray[1]

zeros = np.zeros((10, 9))
zeros[rows, cols] = values

print(zeros)

Output

[[0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 2. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 3. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 4. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]]

An alternative that will add together repeating coordinates, is to use add.at:

np.add.at(zeros, (rows, cols), values)

A second alternative is to use a sparse matrix constructor, for example:

from scipy.sparse import csr_matrix
rows, cols = indexarray[0], indexarray[1]
zeros = csr_matrix((values, (rows, cols)), shape=(10, 9)).toarray()

Output

[[0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 2 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 3 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 4 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]]

CodePudding user response:

You can directly use indexarray in indexing.

r, c = indexarray
zeros[r, c] = values

CodePudding user response:

You can simply use:

zeros[indexarray[0], indexarray[1]] = values
  • Related