Numpy - diziye satır ekle


161

Numpy dizisine nasıl satır eklenir?

Ben bir dizi var:

A = array([[0, 1, 2], [0, 2, 0]])

X'deki her satırın ilk öğesi belirli bir koşulu karşılıyorsa, bu diziye başka bir X dizisinden satır eklemek istiyorum.

Numpy dizilerinin, listelerinki gibi 'ekleme' yöntemi yoktur, ya da öyle görünüyor.

A ve X listeler olsaydı sadece yapardım:

for i in X:
    if i[0] < 3:
        A.append(i)

Eşdeğerini yapmanın sayısal bir yolu var mı ?

Teşekkürler, S ;-)


Yanıtlar:


120

Nedir X? Bir 2D-dizidir, nasıl o zaman bir numara olan satır karşılaştırabilirsiniz: i < 3?

OP'nin yorumundan sonra DÜZENLE:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

ilk öğenin bulunduğu Atüm satırlara ekleyin :X< 3

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
Üzgünüm iyi bir nokta! Her satırın ilk öğesinin bir koşulu karşılaması gereken bir 2D dizisi olduğunu varsayın. Bunu ben düzenleyeceğim. Teşekkürler, S ;-)
Darren J. Fitzpatrick

2
@ DarrenJ.Fitzpatrick Numpy'nin bu tür bir manipülasyon yaparak, Numpy'nin mevcut diziniz için belleği önceden ayırmada yaptığı iyi çalışmaya karşı çalıştığınızı unutmayın A. Açıkçası bu cevaptaki gibi küçük bir problem için bu bir problem değildir, ancak büyük veriler için daha rahatsız edici olabilir.
dtlussier

166

Peki bunu yapabilirsiniz:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@Kris Neden reddedildi? Dokümanlarda
Georgy

1
@Georgy Dürüst olmak gerekirse, bilmiyorum. Burada seninle aynı cevapları arıyordum :-). Yukarıdaki yorumu neden yazdığımı şimdi hatırlayamıyorum. Dokümanlarda kullanımdan kaldırılmış olduğunu görmeliydim. Ama şimdi belgelere bakmak ... öyle değil. Kullanımdan kaldırıldı, sonra tekrar fikirlerini değiştirdiler ve çok fazla insanın itiraz etmesi ve kaldırılması için çok can sıkıcı olacağına karar vermeleri mümkün mü?
Kris

32

Bu soru 7 yıl önce olduğu için, kullandığım en son sürümde numpy sürüm 1.13 ve python3, aynı şeyi bir matrise satır eklemekle yapıyorum , ikinci argümana bir çift ​​parantez koymayı unutmayın , aksi takdirde boyut hatasını yükseltir.

Burada A matrisine ekliyorum

1 2 3
4 5 6

bir sıra ile

7 8 9

aynı kullanım np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

Birinin araya girmesi için, bir sütun eklemek isterseniz,

array = np.c_[A,np.zeros(#A's row size)]

A matrisinde daha önce yaptığımızı takip ederek, ona bir sütun ekleyerek

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

11

Her satırdan sonra hesaplama yapılması gerekmiyorsa, python'a satır eklemek, sonra numpy'ye dönüştürmek çok daha hızlıdır. İşte python 3.6 ile numpy 1.14 arasındaki zamanlama testleri, birer birer 100 satır ekleyerek:

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

Yani, yedi yıl önce orijinal soruya basit bir çözüm, satırı numpy dizisine dönüştürdükten sonra yeni bir satır eklemek için vstack () kullanmaktır. Ancak daha gerçekçi bir çözüm, bu durumda vstack'ın düşük performansını dikkate almalıdır. Her eklemeden sonra dizide veri analizi çalıştırmanız gerekmiyorsa, yeni satırları bir python satır listesine (gerçekten bir liste listesi) arabelleğe almak ve bunları numpy dizisine grup olarak eklemek daha iyidir. herhangi bir veri analizi yapmadan önce vstack () kullanarak.


10

Bunu da yapabilirsiniz:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
hmmm. Bunu denediğimde, OP'nin istediği gibi yeni bir satır eklemek yerine A'nın sonuna ekledi.
Todd Curry

13
muhtemelennp.concatenate((A,newrow), axis=0)
Konstantinos Roditakis

3
Numpy sürümünden 1.12.1(ve Python 3'te), bir vektörü bir matris yükseltmesine birleştirmeye çalışmak gibi görünüyor ValueError: all the input arrays must have same number of dimensions. Görünüşe göre vektörün birleştirilmeye başlamadan önce bir sütun veya satır vektörüne açıkça yeniden şekillendirilmesini istiyor.
MR

3
@MRule @Flora PJ Li stackoverflow.com/a/47845065/1410035 adresindeki cevaba göre çift köşeli parantez kullanarak düzeltebilirsiniz . newrow = [[1,2,3]]
Tom Saleeba

5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

İnşaatı tek bir işlemle yapabiliyorsanız, fantezi-endeksleme ile vstack gibi bir şey iyi bir yaklaşımdır. Ancak durumunuz daha karmaşıksa veya satırlarınız anında devreye giriyorsa, diziyi büyütmek isteyebilirsiniz. Aslında böyle bir şeyi yapmanın sayısal yolu - bir diziyi dinamik olarak büyütmek - bir listeyi dinamik olarak büyütmektir:

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

Listeler bu tür erişim modelleri için oldukça optimize edilmiştir; liste formundayken uygun numpy çok boyutlu dizine sahip değilsiniz, ancak eklediğiniz sürece satır dizileri listesinden daha iyi yapmak zor.


3

Daha hızlı olan 'np.vstack' kullanıyorum, EX:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

Sen kullanabilirsiniz numpy.append()sonradan bir matrise numpty dizisi ve reshape bir satır eklemek için.

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
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.