Python 卷积Numpy脚本的矢量化实现

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

我正在从事一个个人项目,该项目涉及从雷达预测天气模式的变化。我有三个n×m的numpy数组;一个具有降水强度值,一个具有降水X方向的移动(以像素为单位),另一个具有降水Y方向的移动(以像素为单位)。我想使用这三个数组来确定降水像素的位置,使用其他两个数组中的偏移量

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