2013-08-26 37 views
7

Rozważmy następujący prosty przykład:Jak przypisać tablicę 1D numpy do tablicy 2D numpy?

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 

X[:,0] = x # WORKS 

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1) 

X[:,0:1] = (x.reshape(-1, 1)) # WORKS 

Może ktoś wyjaśnić dlaczego numpy ma wektory kształtu (N) niż (n, 1)? Jaki jest najlepszy sposób wykonania rzutowania z tablicy 1D na tablicę 2D?

Dlaczego tego potrzebuję? Ponieważ mam kod, który wstawia wynik x do tablicy 2D X, a rozmiar x zmienia się od czasu do czasu, więc mam X[:, idx1:idx2] = x, który działa, jeśli x jest również 2D, ale nie, jeśli x to 1D.

Odpowiedz

4

Czy naprawdę potrzebujesz obsługiwać wejścia 1D i 2D z tą samą funkcją? Jeśli wiesz, że wejście będzie 1D, użyj

X[:, i] = x 

jeśli wiesz, że wejście będzie 2D, użyj

X[:, start:end] = x 

Jeśli nie znać wymiary wejściowych, polecam przełączanie między jedną lub drugą linią za pomocą if, choć może istnieć sztuczka indeksująca, o której nie wiem, że poradziłaby sobie z nią identycznie.

Twój x ma kształt (N,) zamiast kształtować (N, 1) (lub (1, N)) ponieważ numpy nie jest zbudowany tylko matrix matematyki. ndarrays są n-wymiarowe; wspierają wydajne, spójne wektoryzowane operacje dla dowolnej nieujemnej liczby wymiarów (w tym 0). Chociaż może to czasami powodować, że operacje na macierzach są nieco mniej zwięzłe (szczególnie w przypadku dot dla mnożenia macierzy), generuje to bardziej ogólnie obowiązujący kod, gdy dane są naturalnie 1-wymiarowe lub 3-, 4- lub n-wymiarowe.

0

Myślę, że masz już odpowiedź na swoje pytanie. Numpy pozwala, aby tablice były dowolnej wielkości (podczas gdy Afaik Matlab preferuje dwa wymiary, jeśli to możliwe), więc musisz być z tym poprawny (i zawsze rozróżniać pomiędzy (n,) i (n, 1)). Podając jedną liczbę jako jeden z indeksów (jak 0 w trzecim rzędzie), zmniejszasz wymiarowość o jeden. Dając zakres jako jeden z indeksów (np. 0: 1 w 4. rzędzie), nie zmniejszasz wymiarowości.

Linia 3 ma dla mnie sens i przypisuję ją do tablicy 2-D w ten sposób.

0

Oto dwie sztuczki, które powodują, że kod jest trochę krótszy.

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 
X.T[:1, :] = x 
X[:, 2:3] = x[:, None] 
+2

Czy mógłbyś dodać więcej komentarzy? Nie jest dla mnie jasne, w jaki sposób dotarłeś tutaj z oryginalnego kodu i dlaczego to rozwiązuje problem. – brandones

Powiązane problemy