简体   繁体   中英

What's the most efficient way to replace some given indices of a NumPy array?

I have three arrays, indices , values , and replace_values . I have to loop over indices , replacing each value in old_values[indices[i]] with new_values[i] . What's the fastest possible way to do this? It feels like there should be some way to speed it up using NumPy functions or advanced slicing instead of the normal for loop.

This code works, but is relatively slow:

import numpy as np

# Example indices and values
values = np.zeros([5, 5, 3]).astype(int)

indices = np.array([[0,0], [1,0], [1,3]])
replace_values = np.array([[140, 150, 160], [20, 30, 40], [100, 110, 120]])

print("The old values are:")
print(values)

for i in range(len(indices)):
    values[indices[i][0], indices[i][1]] = replace_values[i]

print("The new values are:")
print(values)

Use zip to separate x and y indices, then cast to tuple and assign:

>>> values[tuple(zip(*indices))] = replace_values
>>> values

array([[[140, 150, 160],
        [  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0]],

       [[ 20,  30,  40],
        [  0,   0,   0],
        [  0,   0,   0],
        [100, 110, 120],
        [  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,   0,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0]]])

Where tuple(zip(*indices)) returns:

((0, 1, 1), (0, 0, 3))

As your indices is np.array itself, you can remove zip and use transpose, as pointed out by @MadPhysicist:

>>> values[tuple(*indices.T)]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM