2013-01-22 12 views
15

I zapoznanie się w dokumentacji numpy dla funkcji r_:Zrozumienie składnię numpy.r_() Połączenie

Łańcuch całkowitą określa, które osi stosu wielu przecinkami rozdzielonych kolumn ze sobą. Ciąg dwóch oddzielonych przecinkami liczb całkowitych umożliwia wskazanie minimalnej liczby wymiarów do wymuszenia wejścia jako drugiej liczby całkowitej (oś do konkatenacji wzdłuż jest nadal pierwszą liczbą całkowitą).

i dają ten przykład:

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

Nie rozumiem, co to dokładnie ciąg '0,2' Instruct numpy zrobić?

Czy poza linkiem powyżej znajduje się inna strona z większą ilością dokumentacji na temat tej funkcji?

Odpowiedz

13

'n,m' mówi r_ aby złączyć razem axis=n i wytwarzają kształt z przynajmniej m wymiarach:

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

Więc jesteśmy łączenie wzdłuż osi = 0, a my normalnie dlatego oczekuj, że wynik będzie miał kształt (6,), ale od m=2 mówimy r_, że kształt musi być co najmniej dwuwymiarowy. Więc zamiast otrzymujemy kształt (2,3):

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

patrzeć na to co się dzieje, gdy zwiększamy 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 

Wszystko można zrobić z r_ mogą być również wykonane z jednego z bardziej czytelnych funkcji array-budowlanych taki jak np.concatenate, np.column_stack, , np.vstack lub np.dstack, chociaż może również wymagać wywołania do reshape.

Nawet z wezwaniem do przekształcenia, te inne funkcje mogą być nawet szybciej:

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) napisał: „Ja nie jestem fan tej notacji. ", zastanawiam się, dlaczego został wprowadzony w liczbach/numarray w pierwszej kolejności. Zwykle podejrzany byłby kompatybilny z matlab, ale zmieniłem fortran-> python i nie wiem wystarczająco dużo matlab by powiedzieć na pewno ... – gboffi

3

Ciąg "0,2" mówi numpy, aby połączyć się wzdłuż osi 0 (pierwsza oś) i owijać elementy w wystarczającą liczbę nawiasów, aby zapewnić dwuwymiarową tablicę. Rozważmy następujące wyniki:

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