2013-01-22 15 views
15

ho letto il seguente nella documentazione numpy per la funzione r_:comprensione la sintassi di numpy.r_() concatenazione

Una stringa intero specifica l'asse da impilare più array virgola separati lungo. Una stringa di due numeri interi separati da virgola consente l'indicazione del numero minimo di dimensioni per forzare ogni voce di come secondo intero (l'asse da concatenare lungo è ancora il primo intero).

e danno questo esempio:

>>> np.r_['0,2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2 
array([[1, 2, 3], 
     [4, 5, 6]]) 

non seguo, che cosa fa esattamente la stringa '0,2' istruire NumPy fare?

Oltre al collegamento sopra, c'è un altro sito con più documentazione su questa funzione?

risposta

13

'n,m' dice r_ per concatenare lungo axis=n, e produrre una forma con almeno m dimensioni:

In [28]: np.r_['0,2', [1,2,3], [4,5,6]] 
Out[28]: 
array([[1, 2, 3], 
     [4, 5, 6]]) 

quindi siamo concatenando lungo l'asse = 0, e normalmente quindi aspettati che il risultato abbia forma (6,), ma dal m=2, stiamo dicendo a r_ che la forma deve essere almeno bidimensionale. Così, invece otteniamo forma (2,3):

In [32]: np.r_['0,2', [1,2,3,], [4,5,6]].shape 
Out[32]: (2, 3) 

Guardate cosa succede quando aumentiamo m:

In [36]: np.r_['0,3', [1,2,3,], [4,5,6]].shape 
Out[36]: (2, 1, 3) # <- 3 dimensions 

In [37]: np.r_['0,4', [1,2,3,], [4,5,6]].shape 
Out[37]: (2, 1, 1, 3) # <- 4 dimensions 

Tutto ciò che si può fare con r_ può essere fatto anche con una delle funzioni array-building più leggibili come np.concatenate, np.row_stack, np.column_stack, np.hstack, np.vstack o np.dstack, sebbene possa anche richiedere una chiamata a reshape.

Anche con la chiamata a rimodellare, quelle altre funzioni possono anche essere più veloce:

In [38]: %timeit np.r_['0,4', [1,2,3,], [4,5,6]] 
10000 loops, best of 3: 38 us per loop 
In [43]: %timeit np.concatenate(([1,2,3,], [4,5,6])).reshape(2,1,1,3) 
100000 loops, best of 3: 10.2 us per loop 
+0

[unutbu] (http://stackoverflow.com/users/190597/unutbu) ha scritto "Io non sono un fan di questa notazione. ", mi chiedo perché è stato introdotto in numeric/numarray in primo luogo. Solitamente il sospetto sarebbe compatibile con MATLAB, ma ho passato fortran-> python e non conosco abbastanza MATLAB per dirlo con certezza ... – gboffi

3

La stringa "0,2" indica numpy da concatenare lungo l'asse 0 (il primo asse) e avvolgere gli elementi in parentesi sufficienti per garantire una matrice bidimensionale. Considerare i seguenti risultati:

for axis in (0,1): 
    for minDim in (1,2,3): 
     print np.r_['{},{}'.format(axis, minDim), [1,2,30, 31], [4,5,6, 61], [7,8,90, 91], [10,11, 12, 13]], 'axis={}, minDim={}\n'.format(axis, minDim) 

[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13] axis=0, minDim=1 

[[ 1 2 30 31] 
[ 4 5 6 61] 
[ 7 8 90 91] 
[10 11 12 13]] axis=0, minDim=2 

[[[ 1 2 30 31]] 

[[ 4 5 6 61]] 

[[ 7 8 90 91]] 

[[10 11 12 13]]] axis=0, minDim=3 

[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13] axis=1, minDim=1 

[[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13]] axis=1, minDim=2 

[[[ 1 2 30 31] 
    [ 4 5 6 61] 
    [ 7 8 90 91] 
    [10 11 12 13]]] axis=1, minDim=3 
Problemi correlati