2017-06-29 89 views
-2

在Python陣列比方說,我有這個計算的事情:矩陣和使用np.array

The law I am trying to apply to calculate xd and yd

什麼是做在Python中的最佳方式?我來自Matlab背景,Matlab中的矩陣很容易處理。我曾嘗試與numpy的,但它給了我此錯誤消息:

ValueError: setting an array element with a sequence. 

這裏是我的代碼片段:

for i in Xh: 
    for u in Yh:  
     E= (np.array([(C,D),(E,F)]) * np.array([(i),(u)])) + np.array([Cx,Cy]) 

請注意,XhYh的名單已經計算出,這是爲什麼我使用for循環(我知道我可以使用列表推導更快)。

+0

您可以提供[MCVE](http://stackoverflow.com/help/mcve)嗎? – Nuageux

+0

使用['numpy.dot'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)進行矩陣向量乘法運算。 '*'運算符通過[broadcast](https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html)執行元素相乘。 –

+0

'()'創建一個序列,你應該在你的數組元素周圍使用'[]'。另外如果你正在嘗試使用'mat_name.dot(vector_name)'來進行矩陣乘法。快速瀏覽一下'E = np.array([[C,D],[E,F]])。dot(np.array([i,u]))+ np.array([Cx,Cy]) '應該足夠了。 –

回答

1

如果你想有一個接近matlab的經驗,可以使用np.matrix而不是np.array。你的數學例子將是,例如

a = np.matrix([[1,2],[3,4]]) 
v1 = np.matrix([[0],[1]]) 
v2 = np.matrix([[1],[1]]) 

res = a*v1+v2 

然而,這不是numpy文檔所推薦的,正如評論中指出的那樣。使用數組的方式非常相似。這裏*是元素方面的乘法(在matlab中是。*)。該矩陣乘法然後可以用做:

a = np.matrix([[1,2],[3,4]]) 
v1 = np.matrix([[0],[1]]) 
v2 = np.matrix([[1],[1]]) 

res = np.dot(a,v1)+v2 # python version <= 3.5 
res = [email protected]+v2 # python version > 3.5 with the new dot operator @ 
+2

的確如此,但我認爲你應該編輯包含正確的方法來做到這一點,因爲它們更常見,並且OP可能會在未來遇到它們。 –

+0

[使用數組](https://docs.scipy。org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use),而不是矩陣! –

0

我發現代碼中的兩個問題:

  1. 您使用圓形的,而不是方括號 - 你有一個列表的列表養活numpy的的二維數組[[a0, a1],[a2, a3]]。這是您的ValueError從何而來。
  2. 您使用的是m1 * m2,這是元素智商的點積,但您應該使用矩陣點積np.dot(m1,m2)或其等效形式m1.dot(m2)

更正:

for i in Xh: 
    for u in Yh: 
     E = np.dot(np.array([[C, D], [E, F]]), np.array([[i], [u]])) + np.array([[Cx], [Cy]]) 
0

您可以使用np.meshgrid to produce all combinations of Xh and Yh,然後np.einsum和廣播在這裏向量化(讀:通過100倍倍加速)在一個行的所有操作:

import numpy as np 

C, D, E, F = 1, 2, 3, 4 
Cx, Cy = 1, 2 
Xh = [1, 2, 3] 
Yh = [4, 5, 6] 

XhYh = np.array(np.meshgrid(Xh, Yh)).T.reshape(-1, 2) 
M = np.array([[C, D], [E, F]]) 
V = np.array([Cx, Cy]) 

E = np.einsum('mk,fk->fm', M, XhYh) + V 

爲100000個XhYh條目速度比較:

%timeit np.einsum('mk,fk->fm', M, XhYh) + V 
# 209 µs ± 2.51 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
%timeit np.array([M.dot(np.array([x, y])) + V for x in Xh for y in Yh]) 
# 32.5 ms ± 608 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) 
+0

''np.einsum()'與''ndarray.dot()'或''''np.matrix'變量相比,有什麼好處? –

+0

對於大矩陣,'.dot()'比'einsum('mk,k-> m')'快,'einsum()'和''+ V'中的廣播速度快於Python'爲'循環。 –