![](/img/trans.png)
[英]The most efficient way of finding indices of element(s) in numpy 2D array
[英]What's the most efficient way to replace some given indices of a NumPy array?
我有三个 arrays、 indices
、 values
和replace_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
分隔x
和y
索引,然后转换为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.