我想要派生numpy ndarray的子類,但我無法正確使用其他numpy類型(如蒙版數組或矩陣)的操作。在我看來,__array_priority__沒有被尊重。作爲一個例子,我已經創建了一個模擬了重要方面的虛擬類:從numpy數組派生類與矩陣和蒙版陣列不能很好地發揮
import numpy as np
class C(np.ndarray):
__array_priority__ = 15.0
def __mul__(self, other):
print("__mul__")
return 42
def __rmul__(self, other):
print("__rmul__")
return 42
我的階級和正常 ndarray工作之間的操作預期:
>>> c1 = C((3, 3))
>>> o1 = np.ones((3, 3))
>>> print(o1 * c1)
__mul__
42
>>> print(c1 * o1)
__rmul__
42
但是,當我嘗試操作與矩陣(或屏蔽陣列)陣列優先不被尊重。
>>> m = np.matrix((3, 3))
>>> print(c1 * m)
__mul__
42
>>> print(m * c1)
Traceback (most recent call last):
...
File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 330, in __mul__
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned
在我看來,ufuncs包裝矩陣和屏蔽陣列的方式並不尊重數組的優先級。是這樣嗎?有沒有解決方法?
其實,給出錯誤消息,因爲它們沒有對齊,因爲'np.matrix((3, 3))'與np.asmatrix(np.ones((3,3)))'不一樣。但是,問題仍然存在,只是'm * c1'是不工作的。 –
@GustavLarsson感謝您的發現。我修正了它,並在動機中增加了更多信息。 – Hernan