Considerare il seguente esercizio nella trasmissione di array Numpy.Numpy, python: espande automaticamente le dimensioni degli array durante la trasmissione
import numpy as np
v = np.array([[1.0, 2.0]]).T # column array
A2 = np.random.randn(2,10) # 2D array
A3 = np.random.randn(2,10,10) # 3D
v * A2 # works great
# causes error:
v * A3 # error
Conosco le regole NumPy per la radiodiffusione, e ho familiarità con bsxfun
funzionalità in Matlab. Capisco perché il tentativo di trasmettere un (2,1) array in un array (2, N, N) fallisce e che devo rimodellare l'array (2,1) in un array (2,1,1) prima di questo la trasmissione passa attraverso
La mia domanda è: c'è un modo per dire a Python di eseguire il rilievo automatico della dimensionalità di un array quando tenta di trasmettere, senza che io debba specificarlo specificatamente?
ho non voglio esplicitamente paio il (2,1) di vettore con l'array multidimensionale sta andando in onda contro --- altrimenti avrei potuto fare qualcosa di stupido e brutto come assurdamente mult_v_A = lambda v,A: v.reshape([v.size] + [1]*(A.ndim-1)) * A
. Non so in anticipo se la matrice "A" sarà 2D o 3D o N-D.
La funzionalità di trasmissione di Matlab bsxfun
include implicitamente le dimensioni necessarie, quindi spero che ci sia qualcosa che potrei fare in Python.
La mia opinione è che questa è una funzionalità e non un bug. Ad esempio, supponiamo di avere un vettore di colonna 2 per 1 'v' e quindi di avere un' ndarray' 2 per 2 per 10. Vuoi rimodellare 'v' per avere forma' (2,1,1) 'o forma' (1,2,1) '? Se si riempiono le dimensioni, potrebbe essere ambiguo per l'utente. Forzare una risagoma esplicita è una procedura generale migliore e lasciare all'utente la possibilità di scrivere una funzione speciale per eseguire automaticamente la riformulazione se l'utente ha una convenzione fissa. Ma non è bello creare una dimensione globale "numpy" che costringa una convention su di te. Sarebbe troppo facile abusare. – ely
-1 @EMS. Questa ambiguità è prontamente risolta specificando che la prima dimensione non singleton verrà utilizzata nella trasmissione. Questo atteggiamento di "In questo modo è meglio" è del tutto inappropriato per i sistemi utilizzati da programmatori professionisti e matematici applicati --- questo è un difetto in termini di illegittimità e conformità, non una caratteristica. –
-1 @Ahmmed Fasih. Sono un matematico applicato che scrive il codice Python per applicazioni scientifiche ogni giorno, e sento che la tua convenzione proposta di adottare sempre la prima dimensione non singleton sarebbe molto scarsa. Molto meglio per te scrivere una funzione che adotta questa convenzione piuttosto che per gli sviluppatori di NumPy preoccuparsi di codificare una convenzione come quella che avvantaggia alcuni utenti (come te), ma non sarebbe utile per altri utenti (come me). – ely