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.


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])

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)

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.



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])


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])

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]


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.

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.