Bagaimana saya bisa memeriksa apakah array numpy kosong atau tidak?

169

Bagaimana saya bisa memeriksa apakah array numpy kosong atau tidak?

Saya menggunakan kode berikut, tetapi ini gagal jika array berisi nol.

if not self.Definition.all():

Apakah ini solusinya?

if self.Definition == array( [] ):
Kicsi Mano
sumber
6
len(array( [] ))adalah 0. len(array( [0] )adalah 1.
Steven Rumbalski
3
Anda ingin menguji array panjang nol, array yang berisi semua nol, atau keduanya? Apa definisi Anda tentang 'kosong'?
John Lyon
12
@StevenRumbalski: Tapi len(array([[]])1 juga!
strpeter
len()memberikan jumlah dimensi pada sumbu pertama. Tetapi sebuah array dapat memiliki dimensi non-nol di sumbu pertama tetapi masih kosong jika memiliki dimensi nol di sumbu lain. sizelebih baik karena merupakan produk dari semua sumbu.
penanggung jawab

Jawaban:

303

Anda selalu dapat melihat .sizeatributnya. Ini didefinisikan sebagai integer , dan nol ( 0) ketika tidak ada elemen dalam array:

import numpy as np
a = np.array([])

if a.size == 0:
    # Do something when `a` is empty
JoshAdel
sumber
4
Ini bagus untuk numpy, tetapi sangat disayangkan itu dianggap unpythonic untuk daftar. Lihat diskusi untuk daftar: stackoverflow.com/questions/53513/... Akan lebih baik jika menggunakan pola yang sama untuk array dan daftar yang numpy.
eric
Kode NumPy secara umum tidak berfungsi dengan benar pada daftar, atau sebaliknya. Anda harus menulis kode dengan cara yang berbeda jika Anda menggunakan daftar vs array NumPy.
penanggung jawab
22

http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2

Objek utama NumPy adalah array multidimensi yang homogen. Dimensi Numpy disebut kapak. Jumlah sumbu adalah peringkat. Kelas array Numpy disebut ndarray. Ia juga dikenal dengan array alias. Atribut yang lebih penting dari objek ndarray adalah:

ndarray.ndim
jumlah sumbu (dimensi) dari array. Di dunia Python, jumlah dimensi disebut sebagai peringkat.

ndarray.membentuk
dimensi array. Ini adalah tupel bilangan bulat yang menunjukkan ukuran array di setiap dimensi. Untuk matriks dengan kolom n rows dan m, bentuknya adalah (n, m). Panjang bentuk tuple karena itu pangkat, atau jumlah dimensi, ndim.

ndarray.size
jumlah total elemen array. Ini sama dengan produk dari unsur-unsur bentuk.

Kolonel Panic
sumber
10

Namun satu peringatan. Perhatikan bahwa np.array (Tidak Ada) .ukuran mengembalikan 1! Ini karena ukuran a. Setara dengan np.prod (a.shape), np.array (None) .shape is (), dan produk kosong adalah 1.

>>> import numpy as np
>>> np.array(None).size
1
>>> np.array(None).shape
()
>>> np.prod(())
1.0

Oleh karena itu, saya menggunakan yang berikut ini untuk menguji apakah array numpy memiliki elemen:

>>> def elements(array):
    ...     return array.ndim and array.size

>>> elements(np.array(None))
0
>>> elements(np.array([]))
0
>>> elements(np.zeros((2,3,4)))
24
pengguna10178557
sumber
8
Array yang berisi Noneobjek bukan array kosong, lihat jawaban di sini untuk perincian lebih lanjut
DrBwts
1
@Brrws yang tidak relevan dengan jawaban ini.
vidstige
@DrBwts Array-nya tidak mengandung Noneobjek. Lihatlah bentuknya.
Navin
Array dengan bentuk ()adalah array skalar, yang memang mengandung elemen (skalar). Dalam contoh ini, skalar adalah None( Nonetidak memiliki arti khusus, ini hanya sebuah array objek). Tergantung pada apa yang Anda lakukan tetapi Anda kemungkinan besar ingin mempertimbangkan skalar array sebagai tidak kosong.
penanggung jawab
-1

Mengapa kita ingin memeriksa apakah array itu empty? Array tidak tumbuh atau menyusut seperti halnya list. Dimulai dengan array 'kosong', dan tumbuh dengan np.appendadalah kesalahan pemula yang sering terjadi.

Menggunakan daftar if alist:bergantung pada nilai booleannya:

In [102]: bool([])                                                                       
Out[102]: False
In [103]: bool([1])                                                                      
Out[103]: True

Tetapi mencoba melakukan hal yang sama dengan menghasilkan array (dalam versi 1.18):

In [104]: bool(np.array([]))                                                             
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value 
   of an empty array is ambiguous. Returning False, but in 
   future this will result in an error. Use `array.size > 0` to 
   check that an array is not empty.
  #!/usr/bin/python3
Out[104]: False

In [105]: bool(np.array([1]))                                                            
Out[105]: True

dan bool(np.array([1,2])menghasilkan kesalahan ambiguitas yang terkenal.

hpaulj
sumber