在Python中应用快速坐标转换

时间:2016-01-27 10:11:05

标签: python numpy grid transform coordinate

我有一个简单的2x2变换矩阵, s ,它编码坐标的一些线性变换,使 X'= sX

我使用 np.meshgrid()函数在网格上生成了一组uniformley分布坐标,此时我遍历每个坐标并按坐标级别在坐标处应用变换。不幸的是,这对于大型阵列来说非常慢。有没有快速的方法这样做?谢谢!

import numpy as np

image_dimension = 1024
image_index = np.arange(0,image_dimension,1) 
xx, yy = np.meshgrid(image_index,image_index)

# Pre-calculated Transformation Matrix.
s = np.array([[ -2.45963439e+04,  -2.54997726e-01], [  3.55680731e-02, -2.48005486e+04]])

xx_f = xx.flatten()
yy_f = yy.flatten()

for x_t in range(0, image_dimension*image_dimension):

    # Get the current (x,y) coordinate.
    x_y_in = np.matrix([[xx_f[x_t]],[yy_f[x_t]]])

    # Perform the transformation with x.
    optout =  s * x_y_in

    # Store the new coordinate.
    xx_f[x_t] = np.array(optout)[0][0]
    yy_f[x_t] = np.array(optout)[1][0]

# Reshape Output
xx_t = xx_f.reshape((image_dimension, image_dimension))
yy_t = yy_f.reshape((image_dimension, image_dimension))

2 个答案:

答案 0 :(得分:4)

您可以使用numpy dot函数获取您的matts的点积:

xx_tn,yy_tn = np.dot(s,[xx.flatten(),yy.flatten()])

xx_t = xx_tn.reshape((image_dimension, image_dimension))
yy_t = yy_tn.reshape((image_dimension, image_dimension))

哪个更快

答案 1 :(得分:2)

Python中的循环很慢。最好使用vectorization。 简而言之,我们的想法是让numpy在C中完成循环,这要快得多。

您可以将您的问题表达为矩阵乘法 X' = sX ,你把所有的点放在 X 中,只需一次调用numpy的点积就可以转换它们:

xy = np.vstack([xx.ravel(), yy.ravel()])
xy_t = np.dot(s, xy)
xx_t, yy_t = xy_t.reshape((2, image_dimension, image_dimension))