2017-04-06 345 views
0

我得到一個不對齊的形狀錯誤在Python中,我不知道如何解決它。我們的目標是在數組和旋轉矩陣之間取得點積。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列表。

感謝您的幫助。

回答

1

我猜你的dataset陣列是一個二維數組,不僅如此,它可能已經是一個numpy的陣列,因爲你可以通過不正常的指標蟒蛇陣列[:(元組)]

因爲,看來這五行

x=dataset[:,0] 
y=dataset[:,1] 
z_nodatum=dataset[:,2] 
stage=dataset[:,17] 
amp=dataset[:,5] 

實際上對應於指定列在datasetx,y,z_notatum,stageamp已經是1xN陣列。

鑑於此,該行:

x=np.array(x) 
y=np.array(y) 

什麼也不做,x和y已經numpy的陣列。 z=-(z_nodatum-2919)從每個元素中減去2919,否定結果並返回生成的numpy數組,如果這實際上是您想要的。但是,z=np.array(z)再次沒有做任何事情,首先你已經有了一個數量龐大的陣列。

這下一行可能也是我不認爲你想要做的事情。

A = np.column_stack(([x],[y])) 

這樣做是需要的1×N個陣列xy陣列,和列堆疊它們,這最終被[[x1, x2... xn, y1, y2...yn]]。什麼,你可能想要的是:

A = np.column_stack((x,y)) 

返回列xy[[x1,y1],[x2, y2]...[xn,yn]]的2D numpy的陣列。需要注意的是,如果這是你打算用X做和y,你可以在開始的時候都做到了這一點:

A = dataset[:,:2] 

這將會給你擺在首位x和y一起,如果他們旁邊對方dataset(取0 - > N-1列,其中n這裏是2)

你的旋轉矩陣似乎有效,但要注意,你可能應該通過創建它:

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]]) 

你只使用字符串格式版本時更方便(即讀取tex來自其他地方)或者你有一些複雜的結構需要它。這裏情況不同。

B=A*R 
在您的版本

你有一個一1x1xN NP陣列,併爲R.這是一個2x2的顯然行不通。

修訂後的變化,我建議,你會得到一個行X列,NX2 * 2x2的操作,這是有效的,因爲內部尺寸匹配。要從B中獲得旋轉的xy,您可以在開始時執行您正在做的操作,B現在是Nx2 numpy陣列(A * B = C,C的大小是A.rows X B.cols ,外形尺寸值):

x_rotated = B[:,0] 
y_rotated = B[:,1] 

現在一切都應該工作。儘管如此,請注意numpy中的矩陣乘法,確保至少有一個值是矩陣,否則您將進行元素乘法(您的R是矩陣)。此外,操作順序可能會使您的公式中的兩個數組(即array * array * matrix)在矩陣運算之前執行元素乘法。