Niezręczna macierz do tablicy


149

Używam Numpy. Mam macierz z 1 kolumną i N wierszami i chcę uzyskać tablicę z N elementów.

Na przykład, jeśli mam M = matrix([[1], [2], [3], [4]]), chcę dostać A = array([1,2,3,4]).

Aby to osiągnąć, używam A = np.array(M.T)[0]. Czy ktoś zna bardziej elegancki sposób na uzyskanie tego samego rezultatu?

Dzięki!


Odpowiedzi:


192

Jeśli chcesz czegoś bardziej czytelnego, możesz to zrobić:

A = np.squeeze(np.asarray(M))

Możesz też zrobić: A = np.asarray(M).reshape(-1)ale to trochę trudniejsze do odczytania.


9
Mała rant z mojej strony ... dlaczego Numpy ma tablice i macierze jako oddzielne jednostki. To jest takie niezdrowe IMHO. Dzięki za tę wskazówkę @Joe.
Naijaba

6
@Naijaba - Za to, co jest warte, klasa matrix jest skutecznie (ale nie formalnie) amortyzowana. Jest tam głównie w celach historycznych. Usunięcie numpy.matrixjest nieco kontrowersyjną kwestią, ale tępi deweloperzy bardzo się z tobą zgadzają, że posiadanie obu jest nieprzyjemne i denerwujące z wielu powodów. Jednak ilość starego, nieobsługiwanego kodu „na wolności”, który wykorzystuje, matrixutrudnia jego całkowite usunięcie.
Joe Kington

1
Nie wspominając o tym, że prawdziwe mnożenie macierzy zostało dodane tylko dla tablic w Numpy 1.10 i zasadniczo jest nadal w wersji beta. Oznacza to, że wiele osób (w tym ja) nadal musi używać macierzy zamiast tablic, aby zrobić to, co chcemy. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Rzadkie macierze mają fundamentalne znaczenie dla uczenia maszynowego wydajnego pod względem pamięci (np sklearn.). W rzeczywistości istnieją różne sparse matrixtypy scipy, które umożliwiają efektywny dostęp przez wiersze lub kolumny. Wyobrażam sobie, że może to być problem związany z łączeniem koncepcji macierzy i tablicy. To powiedziawszy, zastanawiam się, czy można by również wprowadzić sparse arraytyp i czy są jakieś plany, aby to zrobić. Jakieś wskazówki?
pms

Myślę, że .flatten () działa tak samo jak .squeeze (), o ile chcesz mieć na końcu tablicę 1D.
słowa z dnia

122

6
Myślę, że ta odpowiedź jest lepsza niż akceptowana odpowiedź, pod względem wydajności i prostoty
dariush

M.A1 jest świetny, taka sama implementacja jak „ravel” i „flatten” iw tym przypadku nie powoduje żadnej kopii danych A zatem pozostaje połączona z M, co może powodować niespodzianki, jeśli A i / lub M są zmienne. M.flat prawdziwy alternatywny zwracający generator "flatiter" (semantyka tylko do odczytu) np.squeeze (M) # daje widok usuwający wymiary rozmiaru 1, tutaj również ok, ale nie gwarantuje, że będzie to 1-d dla ogólnego M np.reshape ( M, -1) # jest zwykle widokiem zależnym od zgodności kształtu, to „-1” jest okrężną drogą do zrobienia A1 / ravel / flatten
jayprich

13
A, = np.array(M.T)

zależy od tego, co masz na myśli mówiąc o elegancji, ale to właśnie bym zrobił


11

Możesz wypróbować następujący wariant:

result=np.array(M).flatten()

7
np.array(M).ravel()

Jeśli zależy Ci na szybkości; Ale jeśli zależy Ci na pamięci:

np.asarray(M).ravel()

Poprawiłoby to jakość Twojej odpowiedzi, gdybyś wyjaśnił dlaczego
Milo Wielondek

6

Lub możesz spróbować uniknąć niektórych tymczasowych problemów

A = M.view(np.ndarray)
A.shape = -1

2

Po pierwsze, Mv = numpy.asarray(M.T)co daje tablicę 4x1, ale 2D.

Następnie wykonaj A = Mv[0,:], co da ci to, czego chcesz. Możesz je połączyć, jak numpy.asarray(M.T)[0,:].



0

Funkcje ravel () i flatten () z numpy to dwie techniki, które chciałbym tutaj wypróbować. Będę chciał dodać do słupków wykonanych przez Joe , Siraj , bańki i Kevad .

Strzępy:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Spłaszczyć:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()jest szybszy , ponieważ jest to funkcja na poziomie biblioteki, która nie tworzy żadnej kopii tablicy. Jednak każda zmiana w tablicy A zostanie przeniesiona do oryginalnej tablicy M, jeśli używasznumpy.ravel() .

numpy.flatten()jest wolniejszy niżnumpy.ravel() . Ale jeśli używasz numpy.flatten(), aby utworzyć, a następnie zmiany w nie zostaną przeniesione do oryginalnej macierzy M .

numpy.squeeze()i M.reshape(-1)są wolniejsze niż numpy.flatten()i numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.