Dodaj pojedynczy element do tablicy w numpy

122

Mam tablicę numpy zawierającą:

[1, 2, 3]

Chcę utworzyć tablicę zawierającą:

[1, 2, 3, 1]

Oznacza to, że chcę dodać pierwszy element na końcu tablicy.

Spróbowałem oczywistego:

np.concatenate((a, a[0]))

Ale pojawia się błąd mówiąc ValueError: arrays must have same number of dimensions

Nie rozumiem tego - tablice są tylko tablicami 1d.

robintw
źródło
1
np.insert([1,2,3], 3, 1)
Sparkler

Odpowiedzi:

163

append() tworzy nową tablicę, która może być starą tablicą z dołączonym elementem.

Myślę, że bardziej normalne jest użycie właściwej metody dodawania elementu:

a = numpy.append(a, a[0])
Steabert
źródło
29
To polecenie nie zmienia atablicy. Jednak zwraca nową zmodyfikowaną tablicę. Tak więc, jeśli a wymagana jest modyfikacja, a = numpy.append(a,a[0])należy ją zastosować.
Amjad
np.appendużywa np.concatenate. Po prostu zapewnia, że ​​dodatek ma jeden wymiar. Błąd OP to a[0]ma 0 wymiarów.
hpaulj
Po co dołączać tworzy zupełnie nową tablicę, jeśli chcę tylko dodać jeden element?
ed22
Nie podoba mi się fakt, że musimy wywołać inną funkcję dla tak prostego polecenia. Byłoby lepiej, gdyby w samej tablicy istniała metoda wewnętrzna, taka jak a.append(1), a.add(1)lub nawet coś analogicznego do list, takich jaka + [1]
Fernando Wittmann
17

Podczas dołączania tylko raz lub raz od czasu do czasu użycie np.appendna tablicy powinno być w porządku. Wadą tego podejścia jest to, że przy każdym wywołaniu pamięć jest przydzielana dla zupełnie nowej tablicy. Podczas powiększania tablicy dla znacznej liczby próbek lepiej byłoby albo wstępnie przydzielić tablicę (jeśli znany jest całkowity rozmiar), albo dołączyć do listy, a następnie przekonwertować ją na tablicę.

Używając np.append:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Użycie listy Pythona konwertującej później na tablicę:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Wstępna alokacja tablicy numpy:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Kiedy ostateczny rozmiar jest nieznany, wstępne przydzielanie jest trudne, próbowałem wstępnie alokować w kawałkach po 50, ale nie zbliżyło się to do użycia listy.

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Jurgen Strydom
źródło
14

a[0]nie jest tablicą, jest pierwszym elementem ai dlatego nie ma wymiarów.

Spróbuj użyć a[0:1]zamiast tego, co zwróci pierwszy element awewnątrz tablicy pojedynczego elementu.

DMA57361
źródło
12

Spróbuj tego:

np.concatenate((a, np.array([a[0]])))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

concatenate wymaga, aby oba elementy były tablicami numpy; jednak [0] nie jest tablicą. Dlatego to nie działa.

czytelnik_1000
źródło
Lub prościej np.concatenate((a, [a[0]])). Lista i tak zostanie automatycznie podwyższona do typu tablicowego, oszczędzając ci trochę pisania.
Mad Physicist
10

To polecenie,

numpy.append(a, a[0])

nie zmienia atablicy. Jednak zwraca nową zmodyfikowaną tablicę. Jeśli więc awymagana jest modyfikacja, należy użyć następujących elementów.

a = numpy.append(a, a[0])
Amjad
źródło
7
t = np.array([2, 3])
t = np.append(t, [4])
user2804741
źródło
3

Może to być trochę przesada, ale zawsze używam tej np.takefunkcji do dowolnego indeksowania zawijanego:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])
Simon Streicher
źródło
2

Powiedzmy a=[1,2,3]i chcesz, żeby tak było [1,2,3,1].

Możesz użyć wbudowanej funkcji dołączania

np.append(a,1)

Tutaj 1 to int, może to być ciąg znaków i może, ale nie musi, należeć do elementów tablicy. Wydruki:[1,2,3,1]

Nandan Kulkarni
źródło
Witamy w StackOverflow! Możesz przeczytać ten przewodnik, jak sformatować kod, a następnie zaktualizować swoją odpowiedź, aby była bardziej czytelna :) Jest to również bardzo stare pytanie z zaakceptowaną odpowiedzią, lepiej odpowiedzieć na kilka nowych
0mpurdy
0

Jeśli chcesz dodać element, użyj append()

a = numpy.append(a, 1) w tym przypadku dodaj 1 na końcu tablicy

Jeśli chcesz wstawić element, użyj insert()

a = numpy.insert(a, index, 1) w tym przypadku możesz umieścić 1 tam, gdzie chcesz, używając indeksu do ustawienia pozycji w tablicy.

adejonghm
źródło