2015-08-23 26 views
8

Bazı sembolik matris hesaplamalarını semptom ile yapmaya çalışıyorum. Amacım, bazı matris hesaplamalarının sonucunun sembolik bir temsilini elde etmektir. Bu basit örneğe değinmiş olduğum bazı problemlerle karşılaştım, ki burada belirtilen bir matrisin katlanmasının sonucunu değerlendirmeye çalışıyorum ve bunu rastgele bir vektörle çarpıyorum.sympy: 'Transpose' nesnesinin listeye bir özelliği yok

Ben not ettik
>>> I_ = sympy.eye(2) # directly create the identity matrix 
>>> I_ == I # check the two matrices are equal 
True 
>>> I_ * v 
v 

bir şey olduğunu iki kimlik matrisler: Ben doğrudan kimlik matris oluşturmak ve sonra v ile çarpın eğer

>>> import sympy 
>>> v = sympy.MatrixSymbol('v', 2, 1) 
>>> Z = sympy.zeros(2, 2) # create 2x2 zero matrix 
>>> I = sympy.exp(Z) # exponentiate zero matrix to get identity matrix 
>>> I * v 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "sympy/matrices/matrices.py", line 507, in __mul__ 
    blst = B.T.tolist() 
AttributeError: 'Transpose' object has no attribute 'tolist' 

Aksine, daha sonra sorun yoktur farklı sınıfların şunlardır:

>>> I.__class__ 
sympy.matrices.immutable.ImmutableMatrix 
>>> I_.__class__ 
sympy.matrices.dense.MutableDenseMatrix 

Ayrıca as_mutable() yöntemi çağıran bir iş çevresinde sağlanan bulundu.

>>> I.as_mutable() * v 
v 

o kişinin lineer cebir hesaplamalar boyunca as_mutable() çağrıları beklemeye her zaman gerekli midir? Tahmin edemiyorum, ve bu hatalar benim problemimi çözmek için yanlış stratejiyi kullandığımı gösteriyor, ama doğru stratejinin ne olacağını anlayamıyorum. Herhangi bir işaretçi var mı?

Immutable Matrices numaralı belge sayfasını okudum, ancak yine de standart değişebilir matrislerle arasındaki farkların burada nasıl önemli olduğunu ve bazı işlemler (örneğin, sympy.exp) bu farklı sınıflar arasında nasıl dönüştüğünü anlamak için bazı yardımı kullanabilirim.

+0

FYI, hata artık sempinin ana dalında belirlendi. – Phillip

cevap

4

Bu Sympy bir hata olduğunu iddia ediyorum: Python

, sen overload the multiplication operator from both sides olabilir. A*B, dahili olarak A.__mul__(B) veya B.__rmul__(A) numaralı telefonu arayarak işlenebilir. Python önce A.__mul__'u arar ve bu yöntem yoksa veya NotImplemented döndürürse, Python otomatik olarak B.__rmul__'u dener. SymPy, her iki uygulamadan hangisinin kullanılacağına karar vermek için call_highest_priority adlı bir dekoratör kullanır. İlgili sınıfların _op_priority modeline bakar ve daha yüksek önceliğe sahip uygulamanın işlevini çağırır. Davanızdaki öncelikler v ve I için 11 ve I_ için 10.01, yani I tercih edilir. Ayrıca, I'un kullandığı __mul__'un temel uygulaması, dekoratörden yoksundur.

Uzun lafın kısası, I*v hep I.__mul__ arayarak biter ve __mul__MatrixSymbol s işleyemez ama ya NotImplemented döndürmez. v.__rmul__(I) beklendiği gibi çalışıyor.

uygun düzeltme yani

try: 
    blst = B.T.tolist() 
except AttributeError: 
    return NotImplemented 

Python otomatik __rmul__ çare olur, matrices.py içinde AttributeError yakalamak ve NotImplemented dönmek olacaktır. Bu hatayı düzeltmek, _op_priority'u ayarlamak olacaktır. Her iki durumda da, bir hata raporu dosyalamalısınız: Hata tasarımla ilgiliyse (yani, çalışmaması gereken bir şeyi yanlışlıkla denediyseniz), hata iletisi böyle olur.

+0

Bu hatayı kendim rapor ettim: https://github.com/sympy/sympy/issues/11090 – Phillip

İlgili konular