Как я могу проверить пустой массив или нет?


170

Как я могу проверить пустой массив или нет?

Я использовал следующий код, но это не удалось, если массив содержит ноль.

if not self.Definition.all():

Это решение?

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

6
len(array( [] ))это 0. len(array( [0] )это 1.
Стивен Румбальски

3
Вы хотите проверить массив нулевой длины, массив, содержащий все нули, или оба? Каково ваше определение «пустой»?
Джон Лион

12
@StevenRumbalski: Но len(array([[]])это тоже 1!
strpeter

len()дает количество измерений по первой оси. Но массив может иметь ненулевое измерение на первой оси, но все равно быть пустым, если он имеет нулевое измерение на другой оси. sizeлучше, поскольку это произведение всех осей.
asmeurer

Ответы:


304

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

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

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

4
Это отлично подходит для NumPy, но, к сожалению, считается, что он не подходит для списков. Проверьте обсуждение списков: stackoverflow.com/questions/53513/… Было бы неплохо использовать тот же шаблон для numy массивов и списков.
Эриком

Код NumPy в целом не работает должным образом в списках или наоборот. Вы должны писать код по-другому, если вы используете списки и массивы NumPy.
asmeurer

22

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

Основной объект NumPy - это однородный многомерный массив. В Numpy размеры называются осями. Количество осей - ранг. Класс массива Numpy называется ndarray. Это также известно массивом псевдонимов. Более важные атрибуты объекта ndarray:

ndarray.ndim
количество осей (размеров) массива. В мире Python число измерений упоминается как ранг.

ndarray.shape
размеры массива. Это кортеж целых чисел, указывающих размер массива в каждом измерении. Для матрицы с n строками и m столбцами форма будет (n, m). Следовательно, длина кортежа формы - это ранг или число измерений ndim.

ndarray.size
общее количество элементов массива. Это равно произведению элементов формы.


10

Одно предостережение, хотя. Обратите внимание, что np.array (None) .size возвращает 1! Это связано с тем, что a.size эквивалентен np.prod (a.shape), np.array (None) .shape is (), а пустой продукт равен 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, который не имеет отношения к этому ответу.
виджет

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