Boş bir numpy dizisine yeni bir satır nasıl eklenir


158

Standart Python dizilerini kullanarak aşağıdakileri yapabilirim:

arr = []
arr.append([1,2,3])
arr.append([4,5,6])
# arr is now [[1,2,3],[4,5,6]]

Ancak aynı şeyi numpy ile yapamam. Örneğin:

arr = np.array([])
arr = np.append(arr, np.array([1,2,3]))
arr = np.append(arr, np.array([4,5,6]))
# arr is now [1,2,3,4,5,6]

Ben de içine baktım vstack, ama vstackboş bir dizi kullandığımda, elde:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

Peki nasıl numpy ile boş bir diziye yeni bir satır eklerim?


1
Boşsa neden rahatsız oluyorsun? Sadece ilk satırı tutan bir diziden başlayın.
Mart'ta jonrsharpe

10
Sadece boş bir numpy dizisine eklemek mümkün olup olmadığını bilmek istiyorum. Bazen, ekleme işlemleri bir döngü içinde olduğu için böyle bir kod yazmak daha temizdir.
Tony Stark

5
Numpy dizilerinin çalışma şekli göz önüne alındığında, boş bir dizi oluşturmak ve verileri içine koymak çok daha iyidir, örneğin bkz. Stackoverflow.com/questions/568962/…
jonrsharpe

Yanıtlar:


228

İstediğiniz diziyi "başlatmanın" yolu:

arr = np.empty((0,3), int)

Boş bir dizi ama uygun boyutsallığa sahip.

>>> arr
array([], shape=(0, 3), dtype=int64)

Ardından 0 ekseni boyunca eklediğinizden emin olun:

arr = np.append(arr, np.array([[1,2,3]]), axis=0)
arr = np.append(arr, np.array([[4,5,6]]), axis=0)

Ancak, @jonrsharpe haklı. Aslında, bir döngüye ekleyecekseniz, ilk örneğinizdeki gibi bir listeye eklemek çok daha hızlı olurdu, sonra gerçekten numpy kullanmıyorsunuz. döngü sırasında amaçlanan:

In [210]: %%timeit
   .....: l = []
   .....: for i in xrange(1000):
   .....:     l.append([3*i+1,3*i+2,3*i+3])
   .....: l = np.asarray(l)
   .....: 
1000 loops, best of 3: 1.18 ms per loop

In [211]: %%timeit
   .....: a = np.empty((0,3), int)
   .....: for i in xrange(1000):
   .....:     a = np.append(a, 3*i+np.array([[1,2,3]]), 0)
   .....: 
100 loops, best of 3: 18.5 ms per loop

In [214]: np.allclose(a, l)
Out[214]: True

Bunu yapmak için numpythonic yolu, uygulamanıza bağlıdır, ancak daha çok şöyle olacaktır:

In [220]: timeit n = np.arange(1,3001).reshape(1000,3)
100000 loops, best of 3: 5.93 µs per loop

In [221]: np.allclose(a, n)
Out[221]: True

bunu 10 ^ 5 veya 10 ^ 6 kez yapmam gerekirse ne olur? bu yöntemlerin hiçbiri geçerli olmayacak gibi görünüyor. herhangi bir öneri?
Rho Phi

@Roberto, genellikle dizinin boyutunu veya şeklini (en azından değerler tercih edilir) belirlemenin bir yolu vardır. Bunu yapabileceğini düşünüyor musun? Ekleme işlemi gerçekten bir veya iki seferlik bir işlem olmalıdır.
askewchan

bazen boyutları tahmin edemezsiniz, hayattır. Ancak, yeterince büyük bir dizi ayırabilir ve görünümlerine değerler verebilirsiniz. Yine de sevmiyorum, çünkü bir "maske" için bir yol bulmak zorunda istenmeyen değerler vardır. Bu maskeleme fikri gerçekten benim zevkime uymuyor.
Rho Phi

Maskeye gerek yok, sadece dilim! a = a[:N] Yine de, vektörü (bir yardıma ihtiyacınız varsa, özelliklerinizle yeni bir soru yayınlayın) bir yol bulmanız gerektiğine inanıyorum ya da sadece döngü bitene kadar listeleri kullanın.
askewchan

29

İşte benim çözümüm:

arr = []
arr.append([1,2,3])
arr.append([4,5,6])
np_arr = np.array(arr)

Ortaya çıkan dizi, belirli durumlarda kabul edilemeyen bir nesne tipine sahiptir
zer0fool

26

Bu durumda np.hstack ve np.vstack işlevlerini kullanmak isteyebilirsiniz.

arr = np.array([])
arr = np.hstack((arr, np.array([1,2,3])))
# arr is now [1,2,3]

arr = np.vstack((arr, np.array([4,5,6])))
# arr is now [[1,2,3],[4,5,6]]

Ayrıca np.concatenate işlevini de kullanabilirsiniz.

Şerefe


7
İkinci dizinin boyutu = = 2 gibi olanlar ((2, 2)) işe yaramaz. Bana öyle geliyor ki, birleştirme ile boş diziler oluşturuyorsanız, sınır durumlarından kaçınmanın bir yolu yoktur.
Taozi

Her seferinde boyutu kontrol etmesi gerektiği için iyi bir çözüm değil.
SKR

1

özel bir dtype tanımı kullanarak, benim için işe yarayan şuydu:

import numpy

# define custom dtype
type1 = numpy.dtype([('freq', numpy.float64, 1), ('amplitude', numpy.float64, 1)])
# declare empty array, zero rows but one column
arr = numpy.empty([0,1],dtype=type1)
# store row data, maybe inside a loop
row = numpy.array([(0.0001, 0.002)], dtype=type1)
# append row to the main array
arr = numpy.row_stack((arr, row))
# print values stored in the row 0
print float(arr[0]['freq'])
print float(arr[0]['amplitude'])

1

Döngüdeki dizi için yeni satırlar eklenmesi durumunda, diziyi boş bir diziyi başlatmak yerine doğrudan döngüde ilk kez atayın.

for i in range(0,len(0,100)):
    SOMECALCULATEDARRAY = .......
    if(i==0):
        finalArrayCollection = SOMECALCULATEDARRAY
    else:
        finalArrayCollection = np.vstack(finalArrayCollection,SOMECALCULATEDARRAY)

Bu, esas olarak dizinin şekli bilinmediğinde yararlıdır


0

Bir for döngüsü yapmak istiyorum, ancak askewchan'ın yöntemi ile iyi çalışmıyor, bu yüzden değiştirdim.

x=np.empty((0,3))
y=np.array([1 2 3])
for i in ...
x = vstack((x,y))
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.