python - 通过列表理解或映射加速 numpy 数组分配?

标签 python python-3.x multidimensional-array mapping list-comprehension

我试图将一个小的 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/

相关文章:

python - 在 matplotlib 中格式化 3d 条形图

python - Discord.py Bot 的权限系统

python - 定义常量变量 python 3 的最佳方法是什么

python - 如何在标题中添加 cookie?

php - 使用多维数组中的第二个键获取值

python - Adaptive Server 连接失败(DB-Lib 错误消息 20002,严重性 9)

python - 如何为 Python 3 安装发行版

Python3 打印语句无法按预期工作

带有整数的 PHP 多维数组

javascript - Sankey 图,在 PHP 中使用查询创建多维数组