2012-05-04 8 views
5

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?

risposta

0

Quando due oggetti hanno lo stesso __array_priority__:

>>> np.array([[1,0],[0,1]]).__array_priority__ 
0.0 
>>> a.__array_priority__ 
0.0 

E solo uno metodi dell'oggetto possono essere utilizzati, il legame è risolto utilizzando metodi della prima matrice/dell'oggetto. (Nel tuo caso __array_wrap__)

Dalla domanda sembra che i metodi della classe dovrebbero sempre essere preferiti, poiché sono gli stessi (tramite ereditarietà) o sovrascritti.

Quindi vorrei solo alzare il __array_priority__.

class Template(np.ndarray): 
    __array_priority__ = 1.0 (Or whichever value is high enough) 
    ... 

Dopo aver effettuato questa operazione, non importa dove si trova l'oggetto modello in un calcolo. I metodi saranno preferiti rispetto ai metodi degli array standard.

Problemi correlati