Sto provando a sottoclasse la classe ndarray
die ho avuto un po 'di fortuna. Il comportamento che vorrei è quasi identico allo example dato nella documentazione. Voglio aggiungere un parametro name
alla matrice (che uso per tenere traccia di dove i dati provenivano originariamente).Mantenere una sottoclasse numpy ndarray come valore di ritorno durante una trasformazione. Sicuro di impostare __array_priority__?
class Template(np.ndarray):
"""A subclass of numpy's n dimensional array that allows for a
reference back to the name of the template it came from.
"""
def __new__(cls, input_array, name=None):
obj = np.asarray(input_array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.name = getattr(obj, 'name', None)
questo funziona, se non che, come this question, voglio ogni trasformazione che coinvolge il mio sottoclasse di tornare un'altra istanza del mio sottoclasse.
funzioni volte NumPy fanno restituire un'istanza di Template
:
>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here')
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]]))
Template([[1, 2, 3],
[2, 4, 6]])
Tuttavia, a volte non lo fanno:
>>> np.dot(np.array([[1,0],[0,1]]), a)
array([[1, 2, 3],
[2, 4, 6]])
Nella questione ho linkato sopra, è stato suggerito che il PO dovrebbe ignorare il metodo __wrap_array__
per la sottoclasse. Tuttavia, non vedo alcuna giustificazione in questo. In alcune situazioni, sto prendendo il mio comportamento previsto con il valore predefinito __array_wrap__
. The docs sembrano suggerire che sto correndo in una situazione in cui è di __array_wrap__
metodo viene chiamato a causa di un più alto valore di __array_priority__
l'altro argomento: il metodo del dell'ingresso __array_wrap__
Nota che l'ufunc (
np.add
) ha chiamato con il più alto valore__array_priority__
Quindi la mia domanda ha un paio di parti correlate. Primo: posso impostare l'attributo __array_priority__
della mia sottoclasse in modo tale che il suo __array_wrap__
venga sempre chiamato? Secondo: È questo il modo migliore/più semplice per ottenere il comportamento desiderato?