Siy*_*iyh 6 python arrays performance numpy
我正在运行一些模拟,这些模拟涉及将 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
Run Code Online (Sandbox Code Playgroud)
这可以选择使用边缘值或零在数组边缘进行比较。这些功能也可以在任一轴的任一方向上执行此操作。
有人对更快的方法有什么建议吗?我试过np.roll(慢得多)和这个:
yf = np.ix_(range(shapey)[1:] + [shapey,], range(shapex))
shifted_array = my_array[yf]
Run Code Online (Sandbox Code Playgroud)
这有点慢。
在需要 10 小时运行的程序中,这些函数每秒调用约 200 次,因此任何小的加速都更受欢迎!
谢谢。
编辑:
因此,如果每次调用移位函数时都需要相同的微分方法,那么下面的 Divakars 方法似乎提供了较小的加速,但是如果只需要一个移位数组,那么该方法和我上面使用的方法似乎速度相同。
您可以在函数调用中完成移位和微分,如下所示 -
\n\ndef syf1(A, E=True):\n out = np.empty_like(A)\n out[:-1] = A[1:] - A[:-1] # Or np.diff(my_array,axis=0)\n if E == True:\n out[-1] = 0\n else:\n out[-1] = -A[-1]\n return out\nRun Code Online (Sandbox Code Playgroud)\n\n因此,等效的修改版本syf将是 -
def syf(A, E=True):\n if E == True:\n return np.concatenate((A[1:], A[-1].reshape(Yshape)), axis=0) - A\n else:\n return np.concatenate((A[1:], Yzeros), axis=0) - A\nRun Code Online (Sandbox Code Playgroud)\n\n运行时测试
\n\n我们来比较一下等效版本syf问题代码中列出的输入的运行时性能的等效版本与建议的方法进行比较 -
In [113]: %timeit syf(my_array)\n1000 loops, best of 3: 518 \xc2\xb5s per loop\n\nIn [114]: %timeit syf1(my_array)\n1000 loops, best of 3: 494 \xc2\xb5s per loop\nRun Code Online (Sandbox Code Playgroud)\n\n所以,有一些改进!
\n