OverwriteModelError: невозможно перезаписать модель после компиляции

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'])

Вы часто можете уйти с используя списки в контекстах массива, но лучше создавать массивы объектов, поэтому вы получаете эти неявные, а иногда и неожиданные конверсии.

0
задан Federico Grandi 19 January 2019 в 13:29
поделиться