3

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:

zabop
  • 6,750
  • 3
  • 39
  • 84

3 Answers3

3

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]]
Dani Mesejo
  • 61,499
  • 6
  • 49
  • 76
1

You can directly use indexarray in indexing.

r, c = indexarray
zeros[r, c] = values
Ch3steR
  • 20,090
  • 4
  • 28
  • 58
1

You can simply use:

zeros[indexarray[0], indexarray[1]] = values
mozway
  • 194,879
  • 13
  • 39
  • 75