inisialisasi array numpy


129

Apakah ada cara untuk menginisialisasi array numpy bentuk dan menambahkannya? Saya akan menjelaskan apa yang saya butuhkan dengan contoh daftar. Jika saya ingin membuat daftar objek yang dihasilkan dalam satu lingkaran, saya dapat melakukan:

a = []
for i in range(5):
    a.append(i)

Saya ingin melakukan sesuatu yang mirip dengan array numpy. Saya tahu tentang vstack, concatenate dll. Namun, sepertinya ini membutuhkan dua array numpy sebagai input. Yang saya butuhkan adalah:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

The big_arrayharus memiliki bentuk (10,4). Bagaimana cara melakukannya?


EDIT:

Saya ingin menambahkan klarifikasi berikut. Saya sadar bahwa saya dapat mendefinisikan big_array = numpy.zeros((10,4))dan mengisinya. Namun, ini membutuhkan spesifikasi ukuran big_array terlebih dahulu. Saya tahu ukuran dalam hal ini, tetapi bagaimana jika saya tidak melakukannya? Ketika kita menggunakan .appendfungsi untuk memperluas daftar dengan python, kita tidak perlu tahu ukuran akhirnya terlebih dahulu. Saya bertanya-tanya apakah ada yang serupa untuk membuat array yang lebih besar dari array yang lebih kecil, dimulai dengan array kosong.


Kebetulan contoh kode pertama Anda dapat ditulis dengan rapi dan ringkas sebagai daftar pemahaman: [i for i in range(5)]. (Setara:, list(range(5))meskipun ini adalah contoh yang dibuat-buat.)
Katriel

solusi apa yang berhasil untuk Anda? Saya mencoba melakukan sesuatu yang mirip seperti x = numpy.array()yang akan kita lakukan pada daftar seperti y = []; tapi itu tidak berhasil
kRazzy R

Jawaban:


160

numpy.zeros

Kembalikan array baru dengan bentuk dan tipe yang diberikan, diisi dengan nol.

atau

numpy.ones

Kembalikan array baru dengan bentuk dan tipe yang diberikan, diisi dengan yang.

atau

numpy.empty

Kembalikan array baru dengan bentuk dan tipe yang diberikan, tanpa menginisialisasi entri.


Namun, mentalitas di mana kita membangun sebuah array dengan menambahkan elemen ke daftar tidak banyak digunakan dalam numpy, karena itu kurang efisien (tipe data numpy jauh lebih dekat dengan array C yang mendasarinya). Sebagai gantinya, Anda harus melakukan pra-alokasi array ke ukuran yang Anda inginkan, dan kemudian mengisi baris. Anda dapat menggunakan numpy.appendjika Anda harus.


2
Saya tahu bahwa saya dapat mengatur big_array = numpy.zeros dan kemudian mengisinya dengan array kecil yang dibuat. Ini, bagaimanapun, mengharuskan saya untuk menentukan ukuran big_array di muka. Apakah tidak ada yang seperti. Tambahkan fungsi daftar di mana saya tidak memiliki menentukan ukuran di muka. Terima kasih!
Curious2learn

2
@ Curious2learn. Tidak, tidak ada yang cukup seperti menambahkan di Numpy. Ada fungsi yang menggabungkan array atau menumpuknya dengan membuat array baru, tetapi mereka tidak melakukannya dengan menambahkan. Ini karena cara struktur data diatur. Array numpy dibuat menjadi cepat berdasarkan kemampuan untuk dapat lebih kompak menyimpan nilai, tetapi mereka harus memiliki ukuran tetap untuk mendapatkan kecepatan ini. Daftar python dirancang agar lebih fleksibel dengan mengorbankan kecepatan dan ukuran.
Justin Peel

3
@Curious: yah, ada yang appendnumpy. Hanya saja itu kurang efisien untuk tidak melakukan prealokasi (dalam hal ini, jauh lebih efisien, karena appendmenyalin seluruh array setiap waktu), jadi itu bukan teknik standar.
Katriel

1
Bagaimana jika hanya sebagian dari np.emptyarray yang diisi oleh nilai? Bagaimana dengan item "kosong" yang tersisa?
Lee

1
Jika Anda tahu hanya tahu lebar (misalnya dibutuhkan untuk np.concatenate()), Anda dapat menginisialisasi dengan: np.empty((0, some_width)). 0, jadi array pertama Anda tidak akan menjadi sampah.
NumesSanguis

40

Cara saya biasanya melakukan itu adalah dengan membuat daftar reguler, kemudian menambahkan barang-barang saya ke dalamnya, dan akhirnya mengubah daftar menjadi array numpy sebagai berikut:

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

tentu saja objek akhir Anda mengambil dua kali ruang dalam memori pada langkah pembuatan, tetapi menambahkan daftar python sangat cepat, dan pembuatan menggunakan np.array () juga.


11
Ini bukan cara untuk pergi jika Anda tahu ukuran array sebelumnya , namun ... Saya akhirnya menggunakan metode ini ketika saya tidak tahu seberapa besar array nantinya. Misalnya, ketika membaca data dari file atau proses lain. Ini tidak benar-benar mengerikan seperti pada awalnya karena python dan numpy cukup pintar.
travc

18

Diperkenalkan pada numpy 1.8:

numpy.full

Kembalikan array baru dengan bentuk dan tipe yang diberikan, diisi dengan fill_value.

Contoh:

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])

13

Array analog untuk python

a = []
for i in range(5):
    a.append(i)

adalah:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)

5
@NicholasTJ: empty((0))menginisialisasi array yang numpy.
Adobe

2
tanda kurung di np.empty ((0)) berlebihan.
Szymon Roziewski

7

numpy.fromiter() adalah apa yang Anda cari:

big_array = numpy.fromiter(xrange(5), dtype="int")

Ia juga bekerja dengan ekspresi generator, misalnya:

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

Jika Anda mengetahui panjang array sebelumnya, Anda dapat menentukannya dengan argumen 'hitung' opsional.


2
Saya benar-benar menjalankan timeit, dan saya pikir np.fromiter () mungkin lebih lambat daripada np.array (). timeit ("np.array (i untuk i di xrange (100))", setup = "import numpy as np", angka = 10000) -> 0,02539992332458496, dibandingkan timeit ("np.fromiter ((i untuk i di xrange ( 100)), dtype = int) ", setup =" import numpy as np ", number = 10000) -> 0.13351011276245117
hlin117

6

Anda memang ingin menghindari loop eksplisit sebanyak mungkin saat melakukan komputasi array, karena hal itu mengurangi perolehan kecepatan dari bentuk komputasi itu. Ada beberapa cara untuk menginisialisasi array numpy. Jika Anda ingin diisi dengan nol, lakukan seperti katrielalex berkata:

big_array = numpy.zeros((10,4))

EDIT: Urutan macam apa yang Anda buat? Anda harus memeriksa berbagai fungsi numpy yang membuat array, seperti numpy.linspace(start, stop, size)(nomor dengan spasi yang sama), atau numpy.arange(start, stop, inc). Jika memungkinkan, fungsi-fungsi ini akan membuat array jauh lebih cepat daripada melakukan pekerjaan yang sama dalam loop eksplisit


5

Untuk contoh array pertama Anda gunakan,

a = numpy.arange(5)

Untuk menginisialisasi big_array, gunakan

big_array = numpy.zeros((10,4))

Ini mengasumsikan Anda ingin menginisialisasi dengan nol, yang cukup khas, tetapi ada banyak cara lain untuk menginisialisasi array dalam numpy .

Sunting: Jika Anda tidak tahu ukuran big_array di muka, umumnya yang terbaik adalah membuat daftar Python terlebih dahulu menggunakan append, dan ketika Anda telah mengumpulkan semuanya dalam daftar, konversikan daftar ini ke array numpy menggunakan numpy.array(mylist). Alasan untuk ini adalah bahwa daftar dimaksudkan untuk tumbuh dengan sangat efisien dan cepat, sedangkan numpy.concatenate akan sangat tidak efisien karena array numpy tidak mengubah ukuran dengan mudah. Tapi begitu semuanya dikumpulkan dalam daftar, dan Anda tahu ukuran array terakhir, array numpy dapat dibangun secara efisien.


5

Untuk menginisialisasi array numpy dengan matriks tertentu:

import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

keluaran:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]

3

Setiap kali Anda dalam situasi berikut:

a = []
for i in range(5):
    a.append(i)

dan Anda menginginkan sesuatu yang serupa di numpy, beberapa jawaban sebelumnya telah menunjukkan cara untuk melakukannya, tetapi seperti @katrielalex tunjukkan metode ini tidak efisien. Cara efisien untuk melakukan ini adalah membangun daftar panjang dan kemudian membentuknya kembali seperti yang Anda inginkan setelah Anda memiliki daftar panjang. Sebagai contoh, katakanlah saya membaca beberapa baris dari sebuah file dan setiap baris memiliki daftar angka dan saya ingin membangun array bentuk yang numpy (jumlah baris yang dibaca, panjang vektor di setiap baris). Inilah cara saya melakukannya dengan lebih efisien:

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

2

Saya menyadari bahwa ini agak terlambat, tetapi saya tidak melihat jawaban lain yang menyebutkan pengindeksan ke dalam array kosong:

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

Dengan cara ini, Anda mengalokasikan seluruh array hasil dengan numpy.empty dan mengisi baris saat Anda menggunakan tugas yang diindeks.

Sangat aman untuk melakukan praalokasi dengan emptybukan zerosdalam contoh yang Anda berikan karena Anda menjamin bahwa seluruh array akan diisi dengan potongan yang Anda hasilkan.


2

Saya sarankan mendefinisikan bentuk terlebih dahulu. Kemudian beralih di atasnya untuk memasukkan nilai.

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])

1

Mungkin sesuatu seperti ini akan sesuai dengan kebutuhan Anda ..

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

Yang menghasilkan output sebagai berikut

[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]
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.