gpt4 book ai didi

python - 移动 Numpy 数组的最快方法

转载 作者:太空狗 更新时间:2023-10-30 03:00:11 25 4
gpt4 key购买 nike

我正在运行一些模拟,其中涉及重复比较 2D Numpy 数组中的值及其“邻居”;例如。将索引位置 (y,x) 的值与同一数组中索引位置 (y-1,x) 的值进行比较。

目前我正在使用这样的函数:

# example of the typical size of the arrays
my_array = np.ndarray((500,500))

shapey, shapex = my_array.shape
Yshape = (1, shapex)
Yzeros = np.zeros((1, shapex))

def syf(A, E=True):
if E == True:
return np.concatenate((A[1:], A[-1].reshape(Yshape)), axis=0)
else:
return np.concatenate((A[1:], Yzeros), axis=0)

shifted_array = syf(my_array)

difference_in_y = shifted_array - my_array

这可以选择使用边缘值或零来比较数组的边缘。这些函数也可以在任一轴的任一方向上执行此操作。

有没有人对更快的方法有任何建议?我试过 np.roll(慢得多)和这个:

yf = np.ix_(range(shapey)[1:] + [shapey,], range(shapex))
shifted_array = my_array[yf]

这有点慢。

在一个需要 10 小时运行的程序中,这些函数每秒被调用约 200 次,因此欢迎任何小的加速!

谢谢。

编辑:

因此,如果每次调用 shift 函数时都需要相同的微分方法,那么下面的 Divakars 方法似乎可以提供较小的加速,但是如果只需要一个移位数组,那么该方法和我上面使用的方法似乎是相同的速度。

最佳答案

您可以像这样在函数调用中完成移位和微分 -

def syf1(A, E=True):
out = np.empty_like(A)
out[:-1] = A[1:] - A[:-1] # Or np.diff(my_array,axis=0)
if E == True:
out[-1] = 0
else:
out[-1] = -A[-1]
return out

因此,用于运行时比较目的的 syf 的等效修改版本将是 -

def syf(A, E=True):
if E == True:
return np.concatenate((A[1:], A[-1].reshape(Yshape)), axis=0) - A
else:
return np.concatenate((A[1:], Yzeros), axis=0) - A

运行时测试

让我们将 syf 的等效版本与针对问题代码中列出的输入所建议的运行时性能方法进行比较 -

In [113]: %timeit syf(my_array)
1000 loops, best of 3: 518 µs per loop

In [114]: %timeit syf1(my_array)
1000 loops, best of 3: 494 µs per loop

所以,那里有一些改进!

关于python - 移动 Numpy 数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com