繁体   English   中英

替换 NumPy 数组的某些给定索引的最有效方法是什么?

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

我有三个 arrays、 indicesvaluesreplace_values 我必须遍历indices ,用new_values[i]替换old_values[indices[i]]中的每个值。 最快的方法是什么? 感觉应该有某种方法可以使用 NumPy 函数或高级切片而不是正常for循环来加速它。

此代码有效,但相对较慢:

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)

使用zip分隔xy索引,然后转换为tuple并分配:

>>> 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]]])

其中tuple(zip(*indices))返回:

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

正如@MadPhysicist 所指出的,由于您的索引本身就是np.array ,因此您可以删除zip并使用转置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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