Numpy - tambahkan baris ke array


161

Bagaimana cara menambahkan baris ke array numpy?

Saya memiliki array A:

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

Saya ingin menambahkan baris ke array ini dari array X lain jika elemen pertama dari setiap baris dalam X memenuhi kondisi tertentu.

Array numpy tidak memiliki metode 'menambahkan' seperti itu dari daftar, atau begitulah tampaknya.

Jika A dan X adalah daftar, saya hanya akan melakukan:

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

Apakah ada cara numpythonic untuk melakukan hal yang sama?

Terima kasih, S ;-)


Jawaban:


120

Apa X? Jika ini adalah array 2D, bagaimana Anda bisa membandingkan barisnya dengan angka i < 3:?

Sunting setelah komentar OP:

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

tambahkan ke Asemua baris dari Xmana elemen pertama < 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
Maaf poin bagus! Asumsikan array 2D yang elemen pertama dari setiap baris harus memenuhi suatu syarat. Saya akan mengeditnya. Terima kasih, S ;-)
Darren J. Fitzpatrick

2
@ DarrenJ.Fitzpatrick Ingatlah bahwa dengan melakukan manipulasi jenis ini Anda bekerja melawan pekerjaan baik yang Numpy lakukan dalam pra-alokasi memori untuk array yang ada A. Jelas untuk masalah kecil seperti dalam jawaban ini ini bukan masalah, tetapi bisa lebih mengganggu untuk data besar.
dtlussier

166

yah kamu bisa melakukan ini:

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

2
@ Kris Mengapa itu usang? Saya tidak melihat apa pun dalam dokumen
Georgy

1
@ Georgy Sejujurnya, saya tidak tahu. Saya di sini mencari jawaban yang sama dengan Anda :-). Saya tidak ingat sekarang mengapa saya menulis komentar di atas. Saya pasti melihat dalam dokumen itu sudah usang. Tetapi melihat dokumen sekarang ... tidak dikatakan demikian. Mungkinkah mereka mencabutnya, lalu berubah pikiran lagi dan memutuskan terlalu menjengkelkan bagi terlalu banyak orang untuk mencela dan menghapusnya?
Kris

32

Karena pertanyaan ini sudah 7 tahun sebelumnya, dalam versi terbaru yang saya gunakan adalah numpy versi 1.13, dan python3, saya melakukan hal yang sama dengan menambahkan baris ke matriks, ingatlah untuk menempatkan braket ganda pada argumen kedua, jika tidak, itu akan meningkatkan kesalahan dimensi.

Di sini saya menambahkan pada matriks A

1 2 3
4 5 6

dengan satu baris

7 8 9

penggunaan yang sama di 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]]]

Hanya untuk intersted seseorang, jika Anda ingin menambahkan kolom,

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

mengikuti apa yang kami lakukan sebelumnya pada matriks A, menambahkan kolom padanya

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

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

11

Jika tidak ada perhitungan yang diperlukan setelah setiap baris, itu jauh lebih cepat untuk menambahkan baris dalam python, kemudian konversikan menjadi numpy. Berikut adalah tes waktu menggunakan python 3.6 vs numpy 1.14, menambahkan 100 baris, satu per satu:

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

Jadi, solusi sederhana untuk pertanyaan awal, dari tujuh tahun yang lalu, adalah dengan menggunakan vstack () untuk menambahkan baris baru setelah mengonversi baris ke array numpy. Tetapi solusi yang lebih realistis harus mempertimbangkan kinerja vstack yang buruk dalam situasi seperti itu. Jika Anda tidak perlu menjalankan analisis data pada array setelah setiap penambahan, lebih baik untuk buffer baris baru ke daftar python baris (daftar daftar, benar-benar), dan menambahkannya sebagai grup ke array numpy menggunakan vstack () sebelum melakukan analisis data apa pun.


10

Anda juga dapat melakukan ini:

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

2
hmmm. ketika saya mencoba ini, itu hanya ditambahkan ke akhir A, daripada menambahkan baris baru seperti yang diminta OP.
Todd Curry

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

3
Pada versi numpy 1.12.1(dan dalam Python 3), sepertinya mencoba untuk menggabungkan vektor ke matriks ValueError: all the input arrays must have same number of dimensions. Sepertinya ia ingin vektor untuk dibentuk kembali secara eksplisit menjadi kolom atau vektor baris sebelum mau digabungkan.
MRule

3
@MRule Anda dapat memperbaikinya dengan menggunakan tanda kurung ganda sesuai jawaban dari @Flora PJ Li stackoverflow.com/a/47845065/1410035 . 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

Jika Anda dapat melakukan konstruksi dalam satu operasi, maka jawaban seperti vstack-with-fancy-indexing adalah pendekatan yang bagus. Tetapi jika kondisi Anda lebih rumit atau baris Anda masuk dengan cepat, Anda mungkin ingin menumbuhkan array. Sebenarnya cara numpythonic untuk melakukan sesuatu seperti ini - secara dinamis menumbuhkan array - adalah dengan secara dinamis menumbuhkan daftar:

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

Daftar sangat dioptimalkan untuk pola akses semacam ini; Anda tidak memiliki pengindeksan multidimensi numpy yang nyaman saat berada dalam bentuk daftar, tetapi selama Anda menambahkan sulit untuk melakukan lebih baik daripada daftar array baris.


3

Saya menggunakan 'np.vstack' yang lebih cepat, 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

Anda dapat menggunakan numpy.append()untuk menambahkan deretan ke array numpty dan membentuk kembali ke matriks nanti.

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.