Sto provando a sottoclasse un ndarray numpy ma non riesco a ottenere le operazioni con altri tipi di numpy come array mascherato o matrice. Mi sembra che lo __array_priority__ non venga onorato. Per fare un esempio, ho creato una classe fittizio che imita gli aspetti importanti:La classe derivata dall'array numpy non funziona bene con matrice e matrice mascherata
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
operazioni tra la mia classe e normale lavoro ndarray come previsto:
>>> c1 = C((3, 3))
>>> o1 = np.ones((3, 3))
>>> print(o1 * c1)
__mul__
42
>>> print(c1 * o1)
__rmul__
42
Ma, quando cerco di operare con matrice (o array mascherati) la priorità dell'array non viene rispettata.
>>> 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
Mi sembra che il modo ufuncs sono avvolti per array matrice e mascherati non onorare priorità matrice. È questo il caso? C'è una soluzione?
In realtà, viene dato il messaggio di errore perché non sono allineati, in quanto 'np.matrix ((3, 3)) 'non è lo stesso di' np.asmatrix (np.ones ((3, 3))) '. Tuttavia, il problema persiste, tranne che 'm * c1' è quello che non funziona. –
@GustavLarsson Grazie per averlo notato. L'ho risolto e ho aggiunto più informazioni nella motivazione. – Hernan