我正在嘗試在Python中編寫一個函數,它將參數a
作爲輸入列表並返回依賴於這些參數的向量列表u
。然後,我希望能夠使用標準矢量操作(例如標量產品)對u
採取行動。另外,在以下(從this post第二應答啓發)的例子中,該函數將返回兩個初始矢量v
和w
的組合:向量化函數返回Python中的向量列表
import numpy as np
v = np.array([1,0,0])
w = np.array([0,1,0])
a = np.linspace(0,np.pi,4)
def u(a):
u = np.cos(a)*v + np.sin(a)*w
return u
uvec = np.vectorize(u, otypes=[np.ndarray])
ufin = np.array(uvec(a).tolist())
print "ufin =", ufin
print "ufin.v =", np.dot(ufin,v)
這將返回:
ufin = [[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 5.00000000e-01 8.66025404e-01 0.00000000e+00]
[ -5.00000000e-01 8.66025404e-01 0.00000000e+00]
[ -1.00000000e+00 1.22464680e-16 0.00000000e+00]]
ufin.v = [ 1. 0.5 -0.5 -1. ]
這是我想獲得自ufin
表現得像一個向量。你能告訴我是否有其他更簡單的方法來實現這一點?我需要編寫一個代碼,其中需要定義大量的向量和向量操作,並希望它儘可能緊湊。
預先感謝您!
編輯:
我發現基於上次的答案this post另一個(顯然更緊湊)的解決方案。這個想法是將參數列表重塑爲一個列數組,使得該函數的輸出自動(不需要向量化)將一個向量列表作爲二維數組返回。這是這樣完成的:
import numpy as np
from numpy.core.umath_tests import inner1d
v = np.array([1,0,0])
w = np.array([0,1,0])
a = np.linspace(0,np.pi,4).reshape((4,1))
b = np.linspace(0,np.pi/2,4).reshape((4,1))
def u(a):
u = np.cos(a)*v + np.sin(a)*w
return u
print "u(a) =",u(a)
print "u(b) =",u(b)
print "u(a).v =",np.dot(u(a),v)
print "u(a)^v =",np.cross(u(a),v)
# print "u(a).u(b) =",np.dot(u(a),u(b)) # does not work
print "u(a).u(b) =",inner1d(u(a),u(b)) # works
print "u(a)^u(b) =",np.cross(u(a),u(b))
這將返回:
u(a) = [[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 5.00000000e-01 8.66025404e-01 0.00000000e+00]
[ -5.00000000e-01 8.66025404e-01 0.00000000e+00]
[ -1.00000000e+00 1.22464680e-16 0.00000000e+00]]
u(b) = [[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 8.66025404e-01 5.00000000e-01 0.00000000e+00]
[ 5.00000000e-01 8.66025404e-01 0.00000000e+00]
[ 6.12323400e-17 1.00000000e+00 0.00000000e+00]]
u(a).v = [ 1. 0.5 -0.5 -1. ]
u(a)^v = [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 -8.66025404e-01]
[ 0.00000000e+00 0.00000000e+00 -8.66025404e-01]
[ 0.00000000e+00 0.00000000e+00 -1.22464680e-16]]
u(a).u(b) = [ 1.00000000e+00 8.66025404e-01 5.00000000e-01 6.12323400e-17]
u(a)^u(b) = [[ 0. 0. 0. ]
[ 0. 0. -0.5 ]
[ 0. 0. -0.8660254]
[ 0. 0. -1. ]]
它既是涉及初始(u
和v
)和載體(u(a)
和u(b)
的輸出列出操作正確的行爲)以及涉及兩個輸出列表的操作。唯一需要注意的是(輸出矢量列表之間的操作)是必須使用inner1d
函數代替標準np.dot
,因爲後者被解釋爲由於兩個矩陣的大小不一致而無法完成的矩陣乘積。
謝謝你的有用答案。我使用更簡潔的版本編輯了我的初始文章,該版本基於將參數列表重塑爲列數組。你能否告訴我你認爲最適合的方法? – user3450569
有沒有標準的方法(如函數庫)用Python執行這些類型的操作?這種操作在處理物理問題時非常常見(例如,繪製軌道角動量作爲軌道參數的函數),所以如果出現這種情況,我會感到驚訝。 – user3450569
@ user3450569是的,在這種情況下(您的功能恰好是「向量就緒」的),您的解決方案會更加優雅。你也可以寫'a = np.linspace(0,np.pi,4)[:,None]'來獲得我個人覺得在眼睛上更容易的列向量;但這是一個品味問題。你可能想看看'np.ogrid'和'np.ix_'這些在類似的情況下很有用。 –