Numpy'deki diziye tek öğe ekle


122

Aşağıdakileri içeren uyuşmuş bir dizim var:

[1, 2, 3]

Şunları içeren bir dizi oluşturmak istiyorum:

[1, 2, 3, 1]

Yani, dizinin sonuna ilk öğeyi eklemek istiyorum.

Bariz olanı denedim:

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

Ama söylerken bir hata alıyorum ValueError: arrays must have same number of dimensions

Bunu anlamıyorum - dizilerin ikisi de sadece 1d dizileridir.


1
np.insert([1,2,3], 3, 1)
Sparkler

Yanıtlar:


163

append() ekli eleman ile eski dizi olabilecek yeni bir dizi oluşturur.

Bir öğe eklemek için doğru yöntemi kullanmanın daha normal olduğunu düşünüyorum:

a = numpy.append(a, a[0])

29
Bu komut adiziyi değiştirmez . Ancak, yeni bir değiştirilmiş dizi döndürür. Bu nedenle, a değişiklik gerekliyse a = numpy.append(a,a[0])kullanılmalıdır.
Amjad

np.appendkullanır np.concatenate. Sadece eklentinin bir boyutu olduğundan emin olur. OP hatası, a[0]0 boyuta sahipti.
hpaulj

Yalnızca bir öğe eklemek istersem, append neden tamamen yeni bir dizi oluşturur?
ed22

Bu kadar basit bir komut için başka bir fonksiyon çağırmamız gerektiği gerçeğinden hoşlanmıyorum. Kendisi gibi dizide bir iç yöntem olsa daha güzel olurdu a.append(1), a.add(1)gibi listelere hatta şey analoga + [1]
Fernando Wittmann

17

Arada bir veya bir kez eklerken np.append, dizinizde kullanmak iyi olacaktır. Bu yaklaşımın dezavantajı, belleğin her çağrıldığında tamamen yeni bir dizi için ayrılmasıdır. Bir diziyi önemli miktarda örnek için büyütürken, diziyi önceden tahsis etmek (toplam boyut biliniyorsa) veya bir listeye eklemek ve daha sonra bir diziye dönüştürmek daha iyi olacaktır.

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

Daha sonra diziye dönüştürülen python listesini kullanma:

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)

Numpy dizisini önceden ayırma:

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)

Nihai boyut bilinmediğinde ön tahsis zor olduğunda, 50'lik parçalar halinde ön tahsis yapmayı denedim ama liste kullanmaya yaklaşmadı.

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]dizi değildir, öğesinin ilk elemanıdır ave bu nedenle boyutları yoktur.

a[0:1]Bunun yerine, atek bir öğe dizisinin içindeki ilk öğeyi döndüren kullanmayı deneyin .



10

Bu komut,

numpy.append(a, a[0])

adiziyi değiştirmez . Ancak, yeni bir değiştirilmiş dizi döndürür. Bu nedenle, adeğişiklik gerekliyse, aşağıdakiler kullanılmalıdır.

a = numpy.append(a, a[0])


3

Bu biraz abartılı olabilir, ancak her zaman np.takeetrafı sarmalı indeksleme için işlevi kullanırım :

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

Diyelim ki a=[1,2,3]olmasını istiyorsun [1,2,3,1].

Yerleşik ekleme işlevini kullanabilirsiniz

np.append(a,1)

Burada 1 bir int'dir, bir dizge olabilir ve dizideki öğelere ait olabilir veya olmayabilir. Baskılar:[1,2,3,1]


StackOverflow'a hoş geldiniz! Kodun nasıl biçimlendirileceğine dair bu kılavuzu okumak ve ardından cevabınızı daha okunaklı olacak şekilde güncellemek isteyebilirsiniz :) Ayrıca bu, kabul edilmiş bir cevabı olan çok eski bir sorudur, bazı yenilerini cevaplamak daha iyidir
0Sağlam

0

Bir eleman eklemek istiyorsanız şunu kullanın: append()

a = numpy.append(a, 1) bu durumda dizinin sonuna 1 ekleyin

Bir eleman eklemek istiyorsanız şunu kullanın: insert()

a = numpy.insert(a, index, 1) bu durumda dizideki konumu ayarlamak için indeksi kullanarak 1'i istediğiniz yere koyabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.