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

Darren J. Fitzpatrick
sumber

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]])
eumiro
sumber
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])
jknair
sumber
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]])
Flora PJ Li
sumber
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.

rbasham
sumber
10

Anda juga dapat melakukan ini:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
cam
sumber
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)
naman1994
sumber
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.

pengguna2475529
sumber
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])
RAno
sumber
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)
Charles Chow
sumber