我试图将一个小的 2D numpy 数组(“source”)的值添加到一个更大的 2D numpy 数组(“frame”)中,从帧数组中的特定位置开始(“pos_x”,“铭文”)。现在,我有两个 for 循环,将源值添加到每个位置的帧值:
for i in range(x):
for j in range(y):
frame[pos_x+i][pos_y+j] += source[i][j]
(“x”和“y”是源数组的形状)
但是,数组非常大(帧数组形状:5000x8000,源数组形状:1000x5000)。所以这个过程需要相当长的时间(大约15秒)。
有什么方法可以通过列表理解、映射或其他方式来加速这个过程吗?
我已经尝试过使用多个语句和赋值来进行这样的列表理解:
frame = [[frame[pos_x+i][pos_y+j] + source[i][j] for j in range(y)] for i in range(x)]
(改编自主题: How can I do assignments in a list comprehension? 和 Multiple statements in list compherensions in Python? )
但它只需要与原始 for 循环一样长的时间。
另一个想法是仅允许使用 if source[i][j] != 0
进行非零值循环。但当我尝试时,它花费了三倍的时间(潜在的子问题:知道为什么吗?)。
最佳答案
您可以在此处利用 numpy 矢量化,而不是循环以获得巨大的加速。只需计算指数并检查是否超出范围即可。
height, width = source.shape
pos_x2 = pos_x + width
pos_y2 = pos_y + height
#check for possible index out of range
fheight, fwidth = frame.shape
if pos_x2 > fwidth or pos_y2 > fheight:
print('source out of frame bounds')
else:
#add `source` to our slice of `frame`
frame[pos_y:pos_y2, pos_x:pos_x2] += source
虽然从技术上讲,这将具有相同的时间复杂度,但 numpy 使用高效的编译 C 代码,可以利用硬件矢量化等功能,并且没有 Python 解释器的所有开销。
关于python - 通过列表理解或映射加速 numpy 数组分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52519449/