2013-08-03 2 views
3

С помощью следующих массивов объектов:NumPy, почему проверка равенства не работает для массива объектов?

a = np.array([[1], [1, 2], [1, 2, 3], [1], [1]], dtype=object) 
b = np.array([(1,), (1, 2), (1, 2, 3), (1,), (1,)], dtype=object) 

Следующие проверки равенства не работают:

a==[1] 
#array([False, False, False, False, False], dtype=bool) 

b==(1,) 
#array([False, False, False, False, False], dtype=bool) 

, если я использую строки вместо:

c = np.array(['[1]', '[1, 2]', '[1, 2, 3]', '[1]', '[1]']) 

проверка равенства работ:

c == '[1]' 
#array([ True, False, False, True, True], dtype=bool) 

Почему проверка массива ведет себя так?

Если перебрать а или Ь и выполнить проверку также дает ожидаемый результат:

[i==[1] for i in a] 
#[True, False, False, True, True] 

[i==(1,) for i in b] 
#[True, False, False, True, True] 

Спасибо!

ответ

5

NumPy предназначен для автоматической обработки объектов, подобных массиву, в виде массивов во многих ситуациях. Здесь NumPy видит, что [1] и (1,) являются подобными массиву объектами и применяют правила broadcasting. Оси длины-1 с каждой стороны расширяются до длины соответствующей оси другого объекта, и если один объект имеет меньшие размеры, чем другие, то отсутствующие размеры заполняются слева с помощью длины другого объекта в этих размерах. Таким образом,

a == [1] 

дает тот же результат, как

a == numpy.array([1, 1, 1, 1, 1]) 

который представляет собой массив из 5 False с.

+1

спасибо! Знаете ли вы способ избежать правил вещания, чтобы a сравнивался с '[1]' element-wise? –

+0

Нет. Мой совет - избегать использования последовательностей (или массивов) в качестве элементов массива. Вы можете попробовать обернуть их в какой-то определенный объект, не являющийся элементом списка, или посмотреть, подходят ли [маскированные массивы] (http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html) использование случай. – user2357112

+0

Вы можете создать пустой массив shape-'()', а затем заполнить его списком '[1]'. 'c = np.empty ([], dtype = object); c [()] = [1] '. Это позволяет избежать автоматической попытки интерпретировать список как собственный массив. Сравнение 'a' с' c' даст вам результаты, которые вы после. –

Смежные вопросы