Як я можу перевірити, чи є пустий масив порожнім чи ні?


169

Як я можу перевірити, чи є пустий масив порожнім чи ні?

Я використовував наступний код, але це не вдається, якщо масив містить нуль.

if not self.Definition.all():

Це рішення?

if self.Definition == array( [] ):

6
len(array( [] ))дорівнює 0. len(array( [0] )до 1.
Стівен Румбальський

3
чи хочете ви протестувати масив нульової довжини, масив, що містить усі нулі чи обидва? Яке ваше визначення "порожній"?
Джон Ліон

12
@StevenRumbalski: Але len(array([[]])це теж 1!
стріпетер

len()дає кількість розмірів на першій осі. Але масив може мати ненульовий вимір на першій осі, але все ж бути порожнім, якщо він має нульовий вимір на іншій осі. sizeкраще, оскільки це добуток усіх осей.
asmeurer

Відповіді:


303

Ви завжди можете поглянути на .sizeатрибут. Він визначається як ціле число і дорівнює нулю ( 0), коли в масиві немає елементів:

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

if a.size == 0:
    # Do something when `a` is empty

4
Це чудово підходить для нуметів, але прикро, що його вважають непітонічним для списків. Ознайомтесь із обговореннями для списків: stackoverflow.com/questions/53513/… Було б непогано використовувати той самий шаблон для нумерованих масивів та списків.
eric

Код NumPy в цілому не працює належним чином у списках, або навпаки. Ви повинні писати код по-іншому, якщо ви використовуєте списки проти масивів NumPy.
asmeurer

22

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

Основним об'єктом NumPy є однорідний багатовимірний масив. У Numpy розміри називаються осями. Кількість осей - ранг. Клас масивів Numpy називається ndarray. Це також відомо масивом псевдонімів. Більш важливими атрибутами об'єкта ndarray є:

ndarray.ndim
кількість осей (розмірів) масиву. У світі Python кількість вимірів називається рангом.

ndarray.визначте
розміри масиву. Це набір цілих чисел, що вказують розмір масиву в кожному вимірі. Для матриці з n рядками та m стовпцями форма буде (n, m). Отже, довжина кортежу форми - це ранг або кількість розмірів, ndim.

ndarray.розмір
загальної кількості елементів масиву. Це дорівнює добутку елементів форми.


10

Один застереження, хоча. Зауважте, що np.array (None) .size повертає 1! Це тому, що a.size еквівалентний np.prod (a.shape), np.array (None) .shape є (), а порожній продукт дорівнює 1.

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

Тому я використовую наступне, щоб перевірити, чи є у масиві numpy елементи:

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

8
Масив, що містить Noneоб'єкт, не є порожнім масивом, див. Відповіді тут, щоб отримати докладнішу інформацію
DrBwts,

1
@DrBwts, що не відповідає цій відповіді.
vidstige

@DrBwts Його масив не містить Noneоб'єкта. Подивіться на його форму.
Навін

Масиви з формою - ()це скалярні масиви, які містять елемент (скаляр). У цьому прикладі скаляр є None( Noneне має особливого значення, це просто масив об'єктів). Це залежить від того, що ви робите, але ви, швидше за все, хочете вважати скалярні масиви не порожніми.
asmeurer

-1

Чому ми хочемо перевірити, чи є масив empty? Масиви не ростуть і не скорочуються так, як це роблять списки. Починаючи з 'порожнього' масиву, і зростаючи з np.append- це часта помилка початківця.

Використання списку в if alist:шарнірах щодо його булевого значення:

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

Але намагаючись зробити те ж саме з масивом виробляє (у версії 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

і bool(np.array([1,2])створює сумнозвісну помилку неоднозначності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.