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)
Results as expected.
How can I do this without iteration?
Similar but different questions:
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]]
You can directly use indexarray
in indexing.
r, c = indexarray
zeros[r, c] = values
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With