我将运行一些涉及重复比较2D Numpy数组中值的模拟,例如,与其“邻居”相比较;例如,在同一数组中,指数位置
这个选项可以在数组边缘使用边缘值或零进行比较。这些函数还可以在任何轴上的任何方向上执行。有没有人对更快的方法有建议?我已经尝试过np.roll(速度慢得多)和这个:
(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方法似乎可以提供轻微的加速,但是如果只需要一个移位数组,那么上面使用的方法和那个方法的速度是相等的。
scipy.ndimage.convolve1d
,但对于这种情况(非常短的滤波器),它实际上比您当前的方法慢了约2倍。 - Joe Kingtonroll
的代码,它生成了一个类似于你的yf
的索引,然后使用了take
。 - hpaulj