Bagaimana cara membuat array / matriks kosong di NumPy?


311

Saya tidak tahu bagaimana cara menggunakan array atau matriks dengan cara yang biasanya saya gunakan daftar. Saya ingin membuat array kosong (atau matriks) dan kemudian menambahkan satu kolom (atau baris) padanya sekaligus.

Saat ini satu-satunya cara saya dapat menemukan untuk melakukan ini adalah seperti:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

Sedangkan jika itu daftar, saya akan melakukan sesuatu seperti ini:

list = []
for item in data:
    list.append(item)

Apakah ada cara untuk menggunakan notasi semacam itu untuk array atau matriks NumPy ?

Jawaban:


441

Anda memiliki model mental yang salah untuk menggunakan NumPy secara efisien. Array NumPy disimpan dalam blok memori yang berdekatan. Jika Anda ingin menambahkan baris atau kolom ke array yang ada, seluruh array harus disalin ke blok memori baru, menciptakan celah untuk elemen baru yang akan disimpan. Ini sangat tidak efisien jika dilakukan berulang kali untuk membangun array.

Dalam hal menambahkan baris, taruhan terbaik Anda adalah membuat array yang sebesar kumpulan data Anda nantinya, dan kemudian menambahkan data ke baris-demi-baris:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
Ada juga numpy.empty () jika Anda tidak perlu nol array.
janneb

21
Apa manfaat menggunakan kosong () di atas nol ()?
Zach

45
bahwa jika Anda akan menginisialisasi dengan data Anda langsung, Anda menghemat biaya memusatkan perhatian.
marcorossi

16
@maracorossi .empty()berarti seseorang dapat menemukan nilai acak dalam sel, tetapi array dibuat lebih cepat daripada misalnya dengan .zeros()?
user3085931

6
@ user3085931 ya!
Nathan

98

Array NumPy adalah struktur data yang sangat berbeda dari daftar dan dirancang untuk digunakan dengan cara yang berbeda. Penggunaan Anda hstackberpotensi sangat tidak efisien ... setiap kali Anda menyebutnya, semua data dalam array yang ada disalin ke yang baru. ( appendFungsi akan memiliki masalah yang sama.) Jika Anda ingin membangun kolom matriks satu per satu, Anda mungkin lebih baik menyimpannya dalam daftar sampai selesai, dan hanya kemudian mengubahnya menjadi sebuah array.

misalnya


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

itembisa berupa daftar, array, atau apa saja yang dapat diubah, asalkan masing-masing itemmemiliki jumlah elemen yang sama.
Dalam kasus khusus ini ( dataadalah beberapa iterable memegang kolom matriks) Anda cukup menggunakan


mat = numpy.array(data)

(Perhatikan juga bahwa menggunakan listsebagai nama variabel mungkin bukan praktik yang baik karena menutupi tipe bawaan dengan nama itu, yang dapat menyebabkan bug.)

EDIT:

Jika karena alasan tertentu Anda benar-benar ingin membuat array kosong, Anda bisa menggunakannya numpy.array([]), tetapi ini jarang berguna!


1
Apakah array / matriks numpy pada dasarnya berbeda dari yang Matlab?
levesque

1
Jika karena alasan tertentu Anda perlu menentukan array kosong, tapi dengan lebar tetap (misalnya np.concatenate()), Anda dapat menggunakan: np.empty((0, some_width)). 0, jadi array pertama Anda tidak akan menjadi sampah.
NumesSanguis

56

Untuk membuat array multidimensi kosong di NumPy (mis. Array 2D m*nuntuk menyimpan matriks Anda), jika Anda tidak tahu mberapa banyak baris yang akan Anda tambahkan dan tidak peduli tentang biaya komputasi yang disebutkan oleh Stephen Simmons (yaitu membangun kembali Array pada setiap append), Anda dapat menekan untuk 0 dimensi yang Anda ingin menambahkan ke: X = np.empty(shape=[0, n]).

Dengan cara ini Anda dapat menggunakan misalnya (di sini m = 5kami menganggap kami tidak tahu saat membuat matriks kosong, dan n = 2):

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

yang akan memberi Anda:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
Ini harus menjadi jawaban untuk pertanyaan OP yang diajukan, untuk kasus penggunaan di mana Anda tidak tahu # rows sebelumnya, atau ingin menangani kasus yang ada 0 baris
Spcogg yang kedua

26

Saya sering melihat ini karena saya perlu menggunakan numpy.array sebagai set di salah satu proyek sekolah saya dan saya perlu diinisialisasi kosong ... Saya tidak menemukan jawaban yang relevan di sini di Stack Overflow, jadi saya mulai mencoret-coret sesuatu.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

Hasilnya adalah:

In [34]: x
Out[34]: array([], dtype=float64)

Oleh karena itu Anda dapat langsung menginisialisasi array np sebagai berikut:

In [36]: x= np.array([], dtype=np.float64)

Saya harap ini membantu.


Ini tidak berfungsi untuk array, seperti dalam pertanyaan, tetapi dapat berguna untuk vektor.
divenex

a=np.array([])tampaknya default kefloat64
P i

7

Anda dapat menggunakan fungsi append. Untuk baris:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

Untuk kolom:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

EDIT
Tentu saja, seperti yang disebutkan dalam jawaban lain, kecuali jika Anda sedang melakukan pemrosesan (mis. Inversi) pada matriks / array SETIAP kali Anda menambahkan sesuatu ke dalamnya, saya hanya akan membuat daftar, menambahkannya kemudian mengubahnya menjadi Himpunan.


3

Jika Anda benar-benar tidak tahu ukuran akhir array, Anda dapat menambah ukuran array seperti ini:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • Perhatikan 0di baris pertama.
  • numpy.appendadalah pilihan lain. Itu panggilan numpy.concatenate.

3

Anda dapat menerapkannya untuk membangun segala jenis array, seperti nol:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
Jika Anda ingin melakukannya dengan python murni, a= [0] * 5adalah solusi sederhana
Makers_F

3

Berikut adalah beberapa solusi untuk membuat numpys lebih mirip Daftar

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

OUTPUT: array ([2., 24.])


2

Bergantung pada apa Anda menggunakan ini untuk, Anda mungkin perlu menentukan tipe data (lihat 'dtype' ).

Misalnya, untuk membuat array 2D nilai 8-bit (cocok untuk digunakan sebagai gambar monokrom):

myarray = numpy.empty(shape=(H,W),dtype='u1')

Untuk gambar RGB, sertakan jumlah saluran warna dalam bentuk: shape=(H,W,3)

Anda mungkin juga ingin mempertimbangkan nol-inisialisasi dengan numpy.zerosdaripada menggunakan numpy.empty. Lihat catatan di sini .


1

Saya pikir Anda ingin menangani sebagian besar pekerjaan dengan daftar lalu gunakan hasilnya sebagai matriks. Mungkin ini caranya;

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

Saya pikir Anda dapat membuat array numpy kosong seperti:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

Format ini berguna ketika Anda ingin menambahkan array numpy di loop.


0

Untuk membuat array NumPy kosong tanpa mendefinisikan bentuknya ada caranya:

1.

arr = np.array([]) 

lebih disukai. karena Anda tahu Anda akan menggunakan ini sebagai numpy.

2.

arr = []
# and use it as numpy. append to it or etc..

NumPy mengonversinya menjadi tipe np.ndarray sesudahnya, tanpa tambahan [] dimionsion.


0

Mungkin yang Anda cari adalah sesuatu seperti ini:

x=np.array(0)

Dengan cara ini Anda bisa membuat array tanpa elemen apa pun. Mirip dengan:

x=[]

Dengan cara ini Anda dapat menambahkan elemen baru ke array Anda terlebih dahulu.

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.