在 Python 中应用快速坐标变换
Applying a Fast Coordinate Transformation in Python
我有一个简单的 2x2 变换矩阵,s,它对坐标的一些线性变换进行编码,使得 X' = sX。
我已经使用 np.meshgrid() 函数在网格上生成了一组均匀分布的坐标,目前我遍历每个坐标并应用变换按坐标级别的坐标。不幸的是,这对于大型阵列来说非常慢。有什么快速的方法可以做到这一点吗?谢谢!
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))
您可以使用 numpy dot
函数来获取矩阵的点积:
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))
哪个更快
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))
我有一个简单的 2x2 变换矩阵,s,它对坐标的一些线性变换进行编码,使得 X' = sX。
我已经使用 np.meshgrid() 函数在网格上生成了一组均匀分布的坐标,目前我遍历每个坐标并应用变换按坐标级别的坐标。不幸的是,这对于大型阵列来说非常慢。有什么快速的方法可以做到这一点吗?谢谢!
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))
您可以使用 numpy dot
函数来获取矩阵的点积:
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))
哪个更快
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))