Powiedzmy, że mam tablicę NumPy a
:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
I chciałbym dodać kolumnę zer, aby uzyskać tablicę b
:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
Jak mogę to łatwo zrobić w NumPy?
Myślę, że prostszym rozwiązaniem i szybszym uruchomieniem jest wykonanie następujących czynności:
import numpy as np
N = 10
a = np.random.rand(N,N)
b = np.zeros((N,N+1))
b[:,:-1] = a
I czasy:
In [23]: N = 10
In [24]: a = np.random.rand(N,N)
In [25]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1))))
10000 loops, best of 3: 19.6 us per loop
In [27]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 5.62 us per loop
a = np.random.rand((N,N))
naa = np.random.rand(N,N)
np.r_[ ... ]
inp.c_[ ... ]
są użytecznymi alternatywami dlavstack
ihstack
, z nawiasami kwadratowymi [] zamiast round ().Kilka przykładów:
(Powodem nawiasów kwadratowych [] zamiast round () jest to, że Python rozwija np. 1: 4 w kwadracie - cuda przeciążenia.)
źródło
np.c_[ * iterable ]
; zobacz listy wyrażeń .Użyj
numpy.append
:źródło
append
faktycznie właśnie nazywaconcatenate
Jednym ze sposobów korzystania z hstack jest:
źródło
dtype
parametr, nie jest potrzebny, a nawet niedozwolony. Chociaż Twoje rozwiązanie jest wystarczająco eleganckie, nie używaj go, jeśli chcesz często „dołączać” do tablicy. Jeśli nie możesz utworzyć całej tablicy na raz i wypełnić ją później, utwórz listę tablic ihstack
to wszystko na raz.Uważam, że następujące są najbardziej eleganckie:
Zaletą
insert
jest to, że pozwala również wstawiać kolumny (lub wiersze) w innych miejscach wewnątrz tablicy. Zamiast wstawiać pojedynczą wartość, możesz łatwo wstawić cały wektor, na przykład zduplikować ostatnią kolumnę:Który prowadzi do:
Jeśli chodzi o czas,
insert
może być wolniejszy niż rozwiązanie JoshAdel:źródło
insert(a, -1, ...)
dołączyć kolumny. Chyba po prostu to przygotuję.a.shape[axis]
. I. e. jeśli dodajesz wiersz, robisz,np.insert(a, a.shape[0], 999, axis=0)
a dla kolumny - taknp.insert(a, a.shape[1], 999, axis=1)
.Byłem także zainteresowany tym pytaniem i porównałem prędkość
które wszystkie robią to samo dla dowolnego wektora wejściowego
a
. Terminy uprawya
:Zauważ, że wszystkie niesąsiadujące warianty (w szczególności
stack
/vstack
) są ostatecznie szybsze niż wszystkie sąsiednie warianty.column_stack
(ze względu na przejrzystość i szybkość) wydaje się dobrą opcją, jeśli potrzebujesz ciągłości.Kod do odtworzenia fabuły:
źródło
stack
,hstack
,vstack
,column_stack
,dstack
są wszystkie funkcje pomocnicze zbudowane na górzenp.concatenate
. Śledząc definicję stosu , znalazłemnp.stack([a,a])
to, które wywołujenp.concatenate([a[None], a[None]], axis=0)
.np.concatenate([a[None], a[None]], axis=0).T
Przydałoby się dodać dodatek do perfplot, aby pokazać, żenp.concatenate
zawsze może być co najmniej tak szybki, jak działa jego pomocnik.c_
icolumn_stack
Myślę:
jest bardziej elegancki.
źródło
np.concatenate również działa
źródło
np.concatenate
wydaje się 3 razy szybszy niżnp.hstack
dla matryc 2x1, 2x2 i 2x3.np.concatenate
było również bardzo nieznacznie szybsze niż ręczne kopiowanie macierzy do pustej matrycy w moich eksperymentach. Jest to zgodne z odpowiedzią Nico Schlömer poniżej.Zakładając, że
M
ndarray jest (100,3) iy
jest to (100) ndarray,append
można go użyć w następujący sposób:Sztuką jest użycie
Konwertuje
y
to na tablicę 2D (100, 1).teraz daje
źródło
Podoba mi się odpowiedź JoshAdela ze względu na nacisk na wydajność. Niewielkim ulepszeniem wydajności jest uniknięcie narzutu inicjowania zerami, tylko w celu ich zastąpienia. Ma to mierzalną różnicę, gdy N jest duże, puste są używane zamiast zer, a kolumna zer jest zapisywana jako oddzielny krok:
źródło
b[:,-1] = 0
. Ponadto przy bardzo dużych tablicach różnica w wydajnościnp.insert()
staje się znikoma, co może byćnp.insert()
bardziej pożądane ze względu na zwięzłość.np.insert
służy również celowi.Wstawia wartości tutaj
new_col
, przed danym indeksem, tutajidx
wzdłuż jednej osi. Innymi słowy, nowo wstawione wartości zajmąidx
kolumnę i przesuną to, co pierwotnie tam było, i późniejidx
.źródło
insert
nie jest na miejscu, jak można założyć, biorąc pod uwagę nazwę funkcji (patrz dokumenty połączone w odpowiedzi).Dodaj dodatkową kolumnę do tablicy numpy:
np.append
Metoda Numpy przyjmuje trzy parametry, pierwsze dwa są tablicami numpy 2D, a trzeci to parametr osi instruujący wzdłuż której osi dołączyć:Wydruki:
źródło
Trochę późno na imprezę, ale nikt jeszcze nie opublikował tej odpowiedzi, więc dla kompletności: możesz to zrobić za pomocą list, na zwykłej tablicy Python:
źródło
Dla mnie następny sposób wygląda dość intuicyjnie i prosto.
źródło
W moim przypadku musiałem dodać kolumnę jedynek do tablicy NumPy
Po X. kształt => (97, 2)
źródło
Istnieje specjalnie do tego funkcja. Nazywa się numpy.pad
Oto, co mówi w dokumentacji:
źródło