我在python中遇到一个未对齐的形状错误,我不知道如何解决它。目标是在数组和旋转矩阵之间取点积。
我正在调用两个文本文件列表并将它们转换为数组。我没有将两个列表转换为数组,然后正确地转换为矩阵形式吗?
x=dataset[:,0]
y=dataset[:,1]
z_nodatum=dataset[:,2]
stage=dataset[:,17]
amp=dataset[:,5]
x=np.array(x)
y=np.array(y)
z=-(z_nodatum-2919)
z=np.array(z)
A = np.column_stack(([x],[y]))
theta = np.radians(20)
c,s =np.cos(theta), np.sin(theta)
R = np.matrix('{} {};{} {}' .format(c, -s, s, c))
B=A*R
此外,我想采取B并将其转换回x和y列表进行绘图。
感谢您的帮助。
答案 0 :(得分:1)
我猜你的dataset
数组是一个2D数组,不仅如此, 它可能已经是一个numpy数组 ,因为你不能通过[:(tuple)]
鉴于此,看来这五行
x=dataset[:,0]
y=dataset[:,1]
z_nodatum=dataset[:,2]
stage=dataset[:,17]
amp=dataset[:,5]
实际上对应于dataset
中的指定列。 x
,y
,z_notatum
,stage
和amp
已经是1xN数组。
鉴于此,行:
x=np.array(x)
y=np.array(y)
什么都不做,x和y已经是numpy数组。 z=-(z_nodatum-2919)
从每个元素中减去2919,否定结果并返回生成的numpy数组,如果这实际上是你想要的。但同样,z=np.array(z)
没有做任何事情,你首先已经有了一个numpy数组。
下一行可能也是我认为你不想做的事情。
A = np.column_stack(([x],[y]))
这样做需要1xN数组x
和y
的数组,并且列堆栈它们,最终为[[x1, x2... xn, y1, y2...yn]]
。你可能想要的是:
A = np.column_stack((x,y))
返回列x
和y
[[x1,y1],[x2, y2]...[xn,yn]]
的2D numpy数组。请注意,如果这是你要用x和y做的全部,你可以在开头做到这一点:
A = dataset[:,:2]
如果它们在dataset
中彼此相邻(这需要0 - > n-1列,其中n在这里是2),这将首先给你x和y一起
您的旋转矩阵似乎有效,但请注意,您可能应该通过以下方式创建它:
theta = np.radians(20)
cos_theta,sine_theta =np.cos(theta), np.sin(theta)
R = np.matrix([[cos_theta, -sine_theta], [sine_theta, cos_theta]])
您只使用字符串格式版本(如从其他地方读取文本)或者您需要一些复杂的结构。这里情况不同。
B=A*R
在你的版本中你有一个1x1xN np数组用于A,而一个2x2用于R.这显然不会起作用。
根据我建议的修改后的更改,您将得到一行x列,Nx2 * 2x2操作,这是有效的,因为内部大小匹配。要从x
中获取轮换的y
和B
,您可以在开始时执行您正在执行的操作,此时B
现在是一个Nx2 numpy数组(A * B = C,C的大小为A.rows X B.cols,外部尺寸值):
x_rotated = B[:,0]
y_rotated = B[:,1]
现在一切都应该有效。但是要小心numpy中的矩阵乘法,确保至少有一个值是矩阵,否则你将进行元素乘法(你的R
是一个矩阵)。另外,操作顺序可以使等式中的两个数组(即数组*数组*矩阵)在矩阵运算之前执行元素乘法运算。