Powiedz, że mam tablicę a
:
a = np.array([[1,2,3], [4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
Chciałbym przekonwertować go na tablicę 1D (tj. Wektor kolumnowy):
b = np.reshape(a, (1,np.product(a.shape)))
ale to wraca
array([[1, 2, 3, 4, 5, 6]])
co nie jest tym samym, co:
array([1, 2, 3, 4, 5, 6])
Mogę wziąć pierwszy element tej tablicy, aby ręcznie przekonwertować ją na tablicę 1D:
b = np.reshape(a, (1,np.product(a.shape)))[0]
ale to wymaga ode mnie, aby wiedzieć, ile wymiarów ma oryginalna tablica (i połączyć [0] podczas pracy z wyższymi wymiarami)
Czy istnieje niezależny od wymiarów sposób uzyskania wektora kolumny / wiersza z dowolnej tablicy ndarray?
ravel()
zwraca widok, ale nie zawsze jest to prawdą. Są przypadki, w którychravel()
zwraca kopię. </a.ravel()
wygląda na około trzy razy szybszą niża.reshape(-1)
.a.flatten()
jest znacznie wolniejszy, ponieważ musi wykonać kopię.lub po prostu:
źródło
b = a.reshape(-1)
skrótu w pierwszym przykładzie.Jednym z najprostszych sposobów jest użycie
flatten()
, jak w tym przykładzie:Moja tablica wyglądała tak:
Po użyciu
flatten()
:To także rozwiązanie błędów tego typu:
źródło
Aby uzyskać listę tablic o różnym rozmiarze, użyj następującego:
Wynik:
[1 2 3 4 5 6 7 8]
źródło
a
plecówb
?Chciałem zobaczyć wynik testu porównawczego funkcji wymienionych w odpowiedziach, w tym unutbu .
Chcę również zwrócić uwagę, że numpy doc zaleca użycie
arr.reshape(-1)
w widoku przypadku. (chociażravel
jest odrobinę szybszy w następującym wyniku)Reper
Funkcje:
np.ravel
: zwraca widok, jeśli to możliwenp.reshape(-1)
: zwraca widok, jeśli to możliwenp.flatten
: zwraca kopięnp.flat
: zwracanumpy.flatiter
. podobny doiterable
wersja numpy: „1.18.0”
Czasy realizacji dla różnych
ndarray
rozmiarówWniosek
Używany kod
źródło
Chociaż nie używa to formatu tablicy np, (aby leniwie modyfikować mój kod) powinno to zrobić, co chcesz ... Jeśli naprawdę chcesz mieć wektor kolumnowy, będziesz chciał transponować wynik wektora. Wszystko zależy od tego, jak planujesz to wykorzystać.
Więc jeśli potrzebujesz transpozycji, możesz zrobić coś takiego:
źródło