Вы хотите проверить массив нулевой длины, массив, содержащий все нули, или оба? Каково ваше определение «пустой»?
Джон Лион
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
Это отлично подходит для NumPy, но, к сожалению, считается, что он не подходит для списков. Проверьте обсуждение списков: stackoverflow.com/questions/53513/… Было бы неплохо использовать тот же шаблон для numy массивов и списков.
Эриком
Код NumPy в целом не работает должным образом в списках или наоборот. Вы должны писать код по-другому, если вы используете списки и массивы NumPy.
Основной объект NumPy - это однородный многомерный массив. В Numpy размеры называются осями. Количество осей - ранг. Класс массива Numpy называется ndarray. Это также известно массивом псевдонимов. Более важные атрибуты объекта ndarray:
ndarray.ndim
количество осей (размеров) массива. В мире Python число измерений упоминается как ранг.
ndarray.shape
размеры массива. Это кортеж целых чисел, указывающих размер массива в каждом измерении. Для матрицы с n строками и m столбцами форма будет (n, m). Следовательно, длина кортежа формы - это ранг или число измерений ndim.
ndarray.size
общее количество элементов массива. Это равно произведению элементов формы.
Одно предостережение, хотя. Обратите внимание, что 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
@DrBwts, который не имеет отношения к этому ответу.
виджет
@DrBwts Его массив не содержит Noneобъект. Посмотрите на его форму.
Навин
Массивы с формой ()- это скалярные массивы, которые содержат элемент (скаляр). В этом примере скаляр - это None( Noneособого значения не имеет, это просто массив объектов). Это зависит от того, что вы делаете, но вы, скорее всего, хотите считать скалярные массивы не пустыми.
asmeurer
-1
Зачем нам проверять, есть ли массив empty? Массивы не растут и не уменьшаются так же, как списки. Начиная с «пустого» массива, и начиная с него, np.appendчасто начинающая ошибка.
Использование списка в if alist:зависимости от его логического значения:
Но попытка сделать то же самое с массивом производит (в версии 1.18):
In[104]: bool(np.array([]))/usr/local/bin/ipython3:1:DeprecationWarning:The truth value
of an empty array is ambiguous.ReturningFalse, but in
future this will result in an error.Use`array.size >0` to
check that an array isnot empty.#!/usr/bin/python3Out[104]:FalseIn[105]: bool(np.array([1]))Out[105]:True
и bool(np.array([1,2])производит печально известную ошибку неоднозначности.
len(array( [] ))
это 0.len(array( [0] )
это 1.len(array([[]])
это тоже 1!len()
дает количество измерений по первой оси. Но массив может иметь ненулевое измерение на первой оси, но все равно быть пустым, если он имеет нулевое измерение на другой оси.size
лучше, поскольку это произведение всех осей.Ответы:
Вы всегда можете взглянуть на
.size
атрибут. Он определяется как целое число и равен нулю (0
), когда в массиве нет элементов:источник
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
источник
Одно предостережение, хотя. Обратите внимание, что np.array (None) .size возвращает 1! Это связано с тем, что a.size эквивалентен np.prod (a.shape), np.array (None) .shape is (), а пустой продукт равен 1.
Поэтому я использую следующее, чтобы проверить, есть ли в массиве numpy элементы:
источник
None
объект, не является пустым массивом, подробности см. В ответах здесьNone
объект. Посмотрите на его форму.()
- это скалярные массивы, которые содержат элемент (скаляр). В этом примере скаляр - этоNone
(None
особого значения не имеет, это просто массив объектов). Это зависит от того, что вы делаете, но вы, скорее всего, хотите считать скалярные массивы не пустыми.Зачем нам проверять, есть ли массив
empty
? Массивы не растут и не уменьшаются так же, как списки. Начиная с «пустого» массива, и начиная с него,np.append
часто начинающая ошибка.Использование списка в
if alist:
зависимости от его логического значения:Но попытка сделать то же самое с массивом производит (в версии 1.18):
и
bool(np.array([1,2])
производит печально известную ошибку неоднозначности.источник