С помощью следующих массивов объектов: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]
Спасибо!
спасибо! Знаете ли вы способ избежать правил вещания, чтобы a сравнивался с '[1]' element-wise? –
Нет. Мой совет - избегать использования последовательностей (или массивов) в качестве элементов массива. Вы можете попробовать обернуть их в какой-то определенный объект, не являющийся элементом списка, или посмотреть, подходят ли [маскированные массивы] (http://docs.scipy.org/doc/numpy/reference/maskedarray.generic.html) использование случай. – user2357112
Вы можете создать пустой массив shape-'()', а затем заполнить его списком '[1]'. 'c = np.empty ([], dtype = object); c [()] = [1] '. Это позволяет избежать автоматической попытки интерпретировать список как собственный массив. Сравнение 'a' с' c' даст вам результаты, которые вы после. –