Używam numpy i chcę indeksować wiersz bez utraty informacji o wymiarze.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
W tym przykładzie xslice jest teraz 1 wymiarem, ale chcę, aby był (1,10). W R użyłbym X [10,:, drop = F]. Czy jest coś podobnego w numpy. Nie mogłem znaleźć tego w dokumentacji i nie widziałem zadanego podobnego pytania.
Dzięki!
x[None, 10]
zrobi, co chcesz.None
obok ciemności, które kroisz.b
; powinno byćb = np.zeros((100,10))
.X[10,None]
(używając twojego kodu jako przykładu).np.matmul()
lub@
). Właśnie zostałem przez to spalony.Innym rozwiązaniem jest zrobienie
X[[10],:]
lub
I = array([10]) X[I,:]
Wymiarowość tablicy jest zachowywana, gdy indeksowanie jest wykonywane przez listę (lub tablicę) indeksów. Jest to miłe, ponieważ pozostawia wybór między zachowaniem wymiaru a ściskaniem.
źródło
x = np.array([[1,2,3,4]])
jeśli następnie pokroisz go razemx[[0],[1,2]]
, uzyskasz jednowymiarowy.array([2, 3])
Moim zdaniem, wybierając wektory kolumnowe lub wierszowe, najlepiej jest uczynić ten plaster prostym, a następnie użyćnp.reshape
, więc w moim przykładzie byłoby tonp.reshape(x[0,[1,2]],[1,2])
X[[10]]
zostaną zinterpretowane jako,X[10]
a kształt będzie mniejszy; podobnie,X[[10, 20]] == X[10, 20]
a kształt jest jeszcze mniejszya
kształt(10, 20, 30)
, toa[0, :, [0]]
będzie miał kształt(1, 20)
, a nie(20, 1)
, bo w tych ostatnich są nadawane indeksy, doa[[0], :, [0]]
których często nie do końca się spodziewasz! Alea[0, :, :1]
da ci(20, 1)
zgodnie z oczekiwaniami. Co więcej, zobacz powyższy komentarz dla dziwnych przypadków brzegowych z pojedynczym indeksem. Ogólnie wydaje się, że ta metoda ma zbyt wiele przypadków skrajnych.Znalazłem kilka rozsądnych rozwiązań.
1) użycie
numpy.take(X,[10],0)
2) użyj tego dziwnego indeksowania
X[10:11:, :]
W idealnym przypadku powinno to być ustawienie domyślne. Nigdy nie rozumiałem, dlaczego wymiary są kiedykolwiek opuszczane. Ale to dyskusja dla numpy ...
źródło
alist[0]
i zachowywane podczas ich krojenia.slice(n, n+1)
wyodrębnianie indeksun
) powinna być akceptowaną odpowiedzią, ponieważ jest jedyną, która rozciąga się naturalnie na przypadek n-wymiarowy.X[10:11, :]
w Pythonie 3.7.5 (tj. Bez dodatkowego dwukropka po 11)Oto alternatywa, którą lubię bardziej. Zamiast indeksowania za pomocą jednej liczby, indeksuj z zakresem. To znaczy użyj
X[10:11,:]
. (Uwaga:10:11
nie obejmuje 11).import numpy as np X = np.zeros((100,10)) X.shape # >> (100, 10) xslice = X[10:11,:] xslice.shape # >> (1,10)
Ułatwia to zrozumienie również przy większej liczbie wymiarów, bez
None
żonglowania i zastanawiania się, której osi użyć, którego indeksu. Nie ma również potrzeby wykonywania dodatkowych czynności księgowych dotyczących rozmiaru tablicy, tylkoi:i+1
dlai
tych, których używałbyś w zwykłym indeksowaniu.b = np.ones((2, 3, 4)) b.shape # >> (2, 3, 4) b[1:2,:,:].shape # >> (1, 3, 4) b[:, 2:3, :].shape . # >> (2, 1, 4)
źródło
Aby dodać do rozwiązania polegającego na indeksowaniu list lub tablic przez gnebehay, można również użyć krotek:
X[(10,),:]
źródło
Jest to szczególnie denerwujące, jeśli indeksujesz według tablicy, której długość może wynosić 1 w czasie wykonywania. W takim przypadku jest
np.ix_
:źródło