Mam dwie proste jednowymiarowe tablice w NumPy . Powinienem być w stanie połączyć je przy użyciu numpy.concatenate . Ale pojawia się ten błąd dla poniższego kodu:
TypeError: tylko tablice długości 1 mogą być konwertowane na skalary Pythona
Kod
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
Czemu?
python
arrays
numpy
concatenation
numpy-ndarray
wysoka przepustowość
źródło
źródło
np.concatenat(..., axis)
. Jeśli chcesz ułożyć je pionowo, użyjnp.vstack
. Jeśli chcesz ułożyć je w stosy (w wiele tablic) poziomo, użyjnp.hstack
. (Jeśli chcesz ułożyć je głęboko, tj. 3. wymiar, użyjnp.dstack
). Pamiętaj, że te ostatnie są podobne do pandpd.concat
Odpowiedzi:
Linia powinna być:
Tablice, które chcesz połączyć, muszą być przekazywane jako sekwencja, a nie jako osobne argumenty.
Z dokumentacji NumPy :
Próbował zinterpretować twój
b
parametr parametru osi, dlatego narzekał, że nie może go przekonwertować na skalar.źródło
numpy.concatenate(a1, a2, a3)
lubnumpy.concatenate(*[a1, a2, a3])
jeśli wolisz. Płynność Pythona jest na tyle duża, że różnica wydaje się bardziej kosmetyczna niż istotna, ale dobrze jest, gdy API jest spójny (np. Jeśli wszystkie funkcje numpy, które pobierają listy argumentów o zmiennej długości, wymagają wyraźnych sekwencji).def concatx(*sequences, **kwargs)
.). Nie jest to idealne rozwiązanie, ponieważ wydaje się, że w ten sposób nie można wyraźnie nazwać argumentów argumentami w podpisie, ale istnieją obejścia.Istnieje kilka możliwości łączenia tablic 1D, np.
Wszystkie te opcje są równie szybkie w przypadku dużych tablic; dla małych
concatenate
ma niewielką krawędź:Fabuła została stworzona za pomocą perfplot :
źródło
np.concatenate
. Po prostu ręcznie masują listę wejściową na różne sposoby.np.stack
na przykład dodaje dodatkowy wymiar do wszystkich tablic wejściowych. Spójrz na ich kod źródłowy. Tylkoconcatenate
jest kompilowany.np.concatenate
tworzy kopie danych wejściowych. Ta pamięć i koszt czasu przewyższają czas spędzony na „masowaniu” danych wejściowych.Pierwszym parametrem
concatenate
powinna być sama sekwencja tablic do konkatenacji:źródło
Alternatywą jest użycie krótkiej formy „konkatenatu”, czyli „r _ [...]” lub „c _ [...]”, jak pokazano w przykładowym kodzie poniżej (patrz http://wiki.scipy.org / NumPy_for_Matlab_Users, aby uzyskać dodatkowe informacje):
Co skutkuje w:
źródło
vector_b = [1,1,1,1] #short form of "array"
, to po prostu nieprawda. vector_b będzie standardowym typem listy Pythona. Numpy jest jednak całkiem dobry w akceptowaniu sekwencji zamiast zmuszania wszystkich danych wejściowych do typów numpy.array.Oto kilka podejść do zrobienia tego przy użyciu
numpy.ravel()
,numpy.array()
wykorzystując fakt, że tablice 1D można rozpakować w zwykłe elementy:źródło
Kilka innych faktów z niezliczonych dokumentów :
Ze składnią jako
numpy.concatenate((a1, a2, ...), axis=0, out=None)
oś = 0 dla konkatenacji wierszowej oś = 1 dla konkatenacji kolumnowej
Mam nadzieję, że to pomoże !
źródło