Python 卷积Numpy脚本的矢量化实现
我正在从事一个个人项目,该项目涉及从雷达预测天气模式的变化。我有三个n×m的numpy数组;一个具有降水强度值,一个具有降水X方向的移动(以像素为单位),另一个具有降水Y方向的移动(以像素为单位)。我想使用这三个数组来确定降水像素的位置,使用其他两个数组中的偏移量Python 卷积Numpy脚本的矢量化实现,python,numpy,vectorization,Python,Numpy,Vectorization,我正在从事一个个人项目,该项目涉及从雷达预测天气模式的变化。我有三个n×m的numpy数组;一个具有降水强度值,一个具有降水X方向的移动(以像素为单位),另一个具有降水Y方向的移动(以像素为单位)。我想使用这三个数组来确定降水像素的位置,使用其他两个数组中的偏移量 xMax = currentReflectivity.shape[0] yMax = currentReflectivity.shape[1] for x in xrange(c
xMax = currentReflectivity.shape[0]
yMax = currentReflectivity.shape[1]
for x in xrange(currentReflectivity.shape[0]):
for y in xrange(currentReflectivity.shape[1]):
targetPixelX = xOffsetArray[x,y] + x
targetPixelY = yOffsetArray[x,y] + y
targetPixelX = int(targetPixelX)
targetPixelY = int(targetPixelY)
if targetPixelX < xMax and targetPixelY < yMax:
interpolatedReflectivity[targetPixelX,targetPixelY] = currentReflectivity[x,y]
xMax=CurrentReflective.shape[0]
yMax=当前反射率。形状[1]
对于x范围内的x(CurrentReflective.shape[0]):
对于X范围内的y(CurrentReflective.shape[1]):
targetPixelX=xOffsetArray[x,y]+x
targetPixelY=yOffsetArray[x,y]+y
targetPixelX=int(targetPixelX)
targetPixelY=int(targetPixelY)
如果targetPixelX
我想不出一个方法来矢量化它;有什么想法吗?我很确定,你只需将所有内容从循环中取出,就可以将其矢量化:
targetPixelX = (xOffsetArray + np.arange(xMax).reshape(xMax, 1)).astype(np.int)
targetPixelY = (yOffsetArray + np.arange(yMax)).astype(np.int)
mask = ((targetPixelX < xMax) & (targetPixelY < yMax))
interpolatedReflectivity[mask] = currentReflectivity[mask]
targetPixelX=(xOffsetArray+np.arange(xMax).restrape(xMax,1)).astype(np.int)
targetPixelY=(yOffsetArray+np.arange(yMax)).astype(np.int)
遮罩=((目标像素x
这将更快,但内存更密集。基本上,targetPixelX
和targetPixelY
现在是包含每个像素值的数组,这些值以前是在每次迭代的基础上计算的
在
interpolatedReflectivity
中仅设置屏蔽值,类似于if
语句在循环中所做的操作。我非常确定,您可以通过将所有内容从循环中取出来对其进行向量化:
targetPixelX = (xOffsetArray + np.arange(xMax).reshape(xMax, 1)).astype(np.int)
targetPixelY = (yOffsetArray + np.arange(yMax)).astype(np.int)
mask = ((targetPixelX < xMax) & (targetPixelY < yMax))
interpolatedReflectivity[mask] = currentReflectivity[mask]
targetPixelX=(xOffsetArray+np.arange(xMax).restrape(xMax,1)).astype(np.int)
targetPixelY=(yOffsetArray+np.arange(yMax)).astype(np.int)
遮罩=((目标像素x
这将更快,但内存更密集。基本上,targetPixelX
和targetPixelY
现在是包含每个像素值的数组,这些值以前是在每次迭代的基础上计算的
在
interpolatedReflectivity
中仅设置屏蔽值,类似于if
语句在循环中所做的操作。这里是一种使用-
这里有一个矢量化方法,使用-
发布的解决方案对你有用吗?谢谢!!!这正是我要找的!!刚刚标记为答案。发布的解决方案对您有效吗?谢谢!!!这正是我要找的!!只是标记为答案。
def org_app(currentReflectivity, xOffsetArray, yOffsetArray):
m,n = currentReflectivity.shape
interpolatedReflectivity = np.zeros((m,n))
xMax = currentReflectivity.shape[0]
yMax = currentReflectivity.shape[1]
for x in xrange(currentReflectivity.shape[0]):
for y in xrange(currentReflectivity.shape[1]):
targetPixelX = xOffsetArray[x,y] + x
targetPixelY = yOffsetArray[x,y] + y
targetPixelX = int(targetPixelX)
targetPixelY = int(targetPixelY)
if targetPixelX < xMax and targetPixelY < yMax:
interpolatedReflectivity[targetPixelX,targetPixelY] = \
currentReflectivity[x,y]
return interpolatedReflectivity
def broadcasting_app(currentReflectivity, xOffsetArray, yOffsetArray):
m,n = currentReflectivity.shape
interpolatedReflectivity = np.zeros((m,n))
xMax, yMax = m,n
x_arr = np.arange(currentReflectivity.shape[0])[:,None]
y_arr = np.arange(currentReflectivity.shape[1])
targetPixelX_arr = (xOffsetArray[x_arr, y_arr] + x_arr).astype(int)
targetPixelY_arr = (yOffsetArray[x_arr, y_arr] + y_arr).astype(int)
valid_mask = (targetPixelX_arr < xMax) & (targetPixelY_arr < yMax)
R = targetPixelX_arr[valid_mask]
C = targetPixelY_arr[valid_mask]
interpolatedReflectivity[R,C] = currentReflectivity[valid_mask]
return interpolatedReflectivity
In [276]: # Setup inputs
...: m,n = 100,110 # currentReflectivity.shape
...: max_r = 120 # xOffsetArray's extent
...: max_c = 130 # yOffsetArray's extent
...:
...: currentReflectivity = np.random.rand(m, n)
...: xOffsetArray = np.random.randint(0,max_r,(m, n))
...: yOffsetArray = np.random.randint(0,max_c,(m, n))
...:
In [277]: out1 = org_app(currentReflectivity, xOffsetArray, yOffsetArray)
...: out2 = broadcasting_app(currentReflectivity, xOffsetArray, yOffsetArray)
...: print np.allclose(out1, out2)
...:
True
In [278]: %timeit org_app(currentReflectivity, xOffsetArray, yOffsetArray)
100 loops, best of 3: 6.86 ms per loop
In [279]: %timeit broadcasting_app(currentReflectivity, xOffsetArray, yOffsetArray)
1000 loops, best of 3: 212 µs per loop
In [280]: 6860.0/212 # Speedup number
Out[280]: 32.35849056603774