我有一个简单的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))
答案 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))