dt
- это список:
In [50]: dt = [6,7,8,9,10]
In [51]: dt < 8
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-51-3d06f93227f5> in <module>()
----> 1 dt < 8
TypeError: '<' not supported between instances of 'list' and 'int'
<
(.__lt__
) для списков не определен.
Но если один элемент сравнения является ndarray
, то применяется определение numpy __lt__
. dt
превращается в массив, и он выполняет сравнение элементов по элементу.
In [52]: dt < np.array(8)
Out[52]: array([ True, True, False, False, False])
In [53]: np.array(dt) < 8
Out[53]: array([ True, True, False, False, False])
операции с массивом numpy также объясняют часть data +=
:
In [54]: data = [1,2,3,4,5] # a list
In [55]: data + (dt < np.array(8)) # list=>array, and boolean array to integer array
Out[55]: array([2, 3, 3, 4, 5])
In [56]: data
Out[56]: [1, 2, 3, 4, 5]
In [57]: data += (dt < np.array(8))
In [58]: data
Out[58]: array([2, 3, 3, 4, 5])
Фактически Я немного удивлен тем, что с +=
data
был изменен из списка в массив. Это означает, что data+=...
реализовано как назначение:
data = data + (dt <np.array(8))
Обычно +
для списка является конкатенацией:
In [61]: data += ['a','b','c']
In [62]: data
Out[62]: [1, 2, 3, 4, 5, 'a', 'b', 'c']
# equivalent of: data.extend(['a','b','c'])
Вы часто можете уйти с используя списки в контекстах массива, но лучше создавать массивы объектов, поэтому вы получаете эти неявные, а иногда и неожиданные конверсии.