2014-03-28 113 views
0

我想使用qmath,一個四元數的庫。qmath很奇怪AttributeError

from qmath import qmathcore 
a = qmathcore.quaternion([1,2,3,4]) 
print a.conj() 

給了我這樣的回溯

Traceback (most recent call last): 
    File "*******/q_test.py", line 25, in <module> 
    print str(a.conj()) 
    File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 788, in conj 
    return self.real() - self.imag() 
    File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 762, in imag 
    return self - self.real()  
    File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 522, in __sub__ 
    self -= other 
    File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 407, in __isub__ 
    self.other = quaternion(other) 
    File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 81, in __init__ 
    self.q = q.q 
AttributeError: quaternion instance has no attribute 'q' 

但在文檔他們說,這必須工作:

def conj(self): 
    """ 
    Returns the conjugate of the quaternion 
    >>> import qmathcore 
    >>> a = qmathcore.quaternion([1,2,3,4]) 
    >>> a.conj() 
    (1.0-2.0i-3.0j-4.0k) 
    >>> a = qmathcore.hurwitz([1,2,3,4]) 
    >>> a.conj() 
    (1-2i-3j-4k) 
    """ 
    return self.real() - self.imag() 

這是什麼?

+0

順便說一句,有沒有人知道一個很好的四元數python庫?我已經嘗試過'qmath'(見問題),'Quaternion'(不能用非標準化的Qs)和'euclid',它在依賴關係中有很重的scipy,但不能乘以Qs和vector,而'quaternionarray'甚至沒有進口。這真是難過;這真是傷心。 – akaRem

+0

這個'qmath.quaternion(np.float64(1))'產生相同的錯誤。 'qmath.quaternion(np.float(1))'工作正常。我懷疑'qmath'寫了2年後'numpy'的變化。 – hpaulj

回答

0

qmathcore.py以較新的(1.9)numpy未通過自己的doctest測試。

添加此測試quatereon()

elif isinstance(q,float) or isinstance(q,int): # accept np.float64 
     self.q = 1.0 * np.array([q,0.,0.,0.]) 

允許qmath.quaternion([1,2,3,4]).imag()(和conj)。

quaternion方法使用了很多type(q)==xxx測試。 isinstance()是一個更強大的測試。它也以else:pass結尾,因此不會捕獲它無法處理的值q

糾正一些導入錯誤後,qmathcore doctest運行良好。

+0

林不知道這是答案,但接受。在我的項目中,我實現了自己的四元數代數。但仍......非常感謝您的回答! – akaRem

+0

我一直在看'qmath'多一些。這個數學似乎沒問題,但是對Python類的處理,特別是對「quaternion」的子類化處理是粗糙的。重點似乎是處理各種輸入格式,而不是爲進一步計算提供有用的信息。 – hpaulj