Gran parte della confusione deriva dalla nostra intuizione umana: come pensiamo di spostare un asse. Potremmo specificare un numero di passi di scorrimento (avanti o indietro di 2 passi) o una posizione nella tupla di forma finale o posizione relativa alla forma originale.
Penso che la chiave per capire rollaxis
è di concentrarsi sugli slot nella forma originale. L'affermazione più generale che posso venire in mente è:
Rotolo a.shape[axis]
alla posizione prima a.shape[start]
before
in questo contesto significa lo stesso che nella lista insert()
. Quindi è possibile inserire prima della fine.
L'azione di base di rollaxis
è:
axes = list(range(0, n))
axes.remove(axis)
axes.insert(start, axis)
return a.transpose(axes)
Se axis<start
, poi start-=1
per tenere conto per l'azione remove
.
I valori negativi sono +=n
, quindi rollaxis(a,-2,-3)
corrisponde a np.rollaxis(a,2,1)
. per esempio. a.shape[-3]==a.shape[1]
. L'elenco insert
consente anche una posizione di inserimento negativa, ma rollaxis
non utilizza questa funzione.
Quindi le chiavi capiscono che la coppia di azioni remove/insert
e la comprensione transpose(x)
.
Ho il sospetto che rollaxis
sia una versione più intuitiva di transpose
.Che lo raggiunga o meno è un'altra domanda.
Lei suggerisce sia omettendo il start-=1
o applicare su tutta la linea
Tralasciando che non modifica i 2 esempi. Ha effetto solo sul caso rollaxis(a,1,4)
e axes.insert(4,1)
corrisponde a axes.insert(3,1)
quando axes
è [0,2,3]
. Il 1
è ancora posizionato alla fine. La modifica che prova un po ':
np.rollaxis(a,1,3).shape
# (3, 5, 4, 6) # a.shape[1](4) placed before a.shape[3](6)
senza la -=1
# transpose axes == [0, 2, 3, 1]
# (3, 5, 6, 4) # the 4 is placed at the end, after 6
Se invece -=1
applica sempre
np.rollaxis(a,3,1).shape
# (3, 6, 4, 5)
diventa
(6, 3, 4, 5)
ora esimo e 6
è prima dello 3
, che era l'originale a.shape[0]
. Dopo il rotolo 3
è il a.shape[1]
. Ma questa è una diversa specifica roll
.
Si tratta di come è definito start
. È una posizione nell'ordine originale o una posizione nell'ordine restituito?
Se si preferisce pensare a start
come posizione di indice nella forma finale, non sarebbe più semplice far cadere la parte before
e dire 'spostare axis
a dest
fessura'?
myroll(a, axis=3, dest=0) => (np.transpose(a,[3,0,1,2])
myroll(a, axis=1, dest=3) => (np.transpose(a,[0,2,3,1])
Basta far cadere il test -=1
potrebbe fare il trucco (Omissione la gestione dei numeri negativi e confini)
def myroll(a,axis,dest):
x=list(range(a.ndim))
x.remove(axis)
x.insert(dest,axis)
return a.transpose(x)
Concordo, il la documentazione (e il comportamento osservato) non corrispondono. Inoltre la documentazione non menziona che si possono usare indici negativi (come con l'indicizzazione di liste python) per contare all'indietro. Sembra che ci sia almeno un problema su GitHub riguardo questo argomento. – PeterE
Correlati: http://stackoverflow.com/q/22583792/1461210 –
Gli ingressi 'transpose 'corrispondenti sono più facili da capire? 'np.transpose (a, [0,2,3,1]). shape' e' np.transpose (a, [0,3,1,2]). shape' – hpaulj