[英]What's the most efficient way to replace some given indices of a NumPy array?
I have three arrays, indices
, values
, and replace_values
.我有三个 arrays、
indices
、 values
和replace_values
。 I have to loop over indices
, replacing each value in old_values[indices[i]]
with new_values[i]
.我必须遍历
indices
,用new_values[i]
替换old_values[indices[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.感觉应该有某种方法可以使用 NumPy 函数或高级切片而不是正常
for
循环来加速它。
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:使用
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]]])
Where tuple(zip(*indices))
returns:其中
tuple(zip(*indices))
返回:
((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:正如@MadPhysicist 所指出的,由于您的索引本身就是
np.array
,因此您可以删除zip
并使用转置:
>>> values[tuple(*indices.T)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.