假设我有一个NumPy数组x
和索引idx
:
x = np.ones(20)
idx = np.array([1, 2, 10, 19])
对于这些索引,如果我希望将x
的值设置为零,则可以执行以下操作:
x[idx] = 0
但是,对于这些索引中的每一个,我也想将它们的m
邻居设置为零(请注意,m < 0
指的是索引左侧的m
邻居,m > 0
指的是索引右侧的m
邻居)。天真地说,我可以这样做:
# Note this example only works when `m > 0`
m = 3
for i in idx:
x[i:i+m] = 0
array([1., 0., 0., 0., 0., 1., 1., 1., 1., 1., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0.])
当x
和idx
都非常、非常长时,避免或改进此for循环性能的最佳方法是什么?
更新
实际上,len(x)
是100_000_000
,len(idx)
是10_000
。我需要在不到一秒的时间内执行这个命令。
3条答案
按热度按时间r7xajy2e1#
我想到的是:创建一个受影响的索引的组合列表。然后将其修剪为原始数组的大小。然后访问该阵列。
vltsax252#
产出
1.对
idx
的每个元素使用zip
创建包含+1和-1的np.array
1.由于可能存在超出/低于x范围的值,请使用
np.clip
将它们放入允许的索引中1.现在您可以像使用索引一样使用创建的数组
iyfjxgzm3#
我认为numpy.linspace在这里很有用。重要的是要将“Endpoint”选项设置为False,以避免交叉链接范围。
对于大型数组,执行时间不是很长: