Ответ 1
Вы можете сделать это, создав массив dtype=object
. Если вы попытаетесь назначить длинную строку нормальному массиву numpy, она обрезает строку:
>>> a = numpy.array(['apples', 'foobar', 'cowboy'])
>>> a[2] = 'bananas'
>>> a
array(['apples', 'foobar', 'banana'],
dtype='|S6')
Но когда вы используете dtype=object
, вы получаете массив ссылок на объекты python. Таким образом, вы можете иметь все поведения строк python:
>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object)
>>> a
array([apples, foobar, cowboy], dtype=object)
>>> a[2] = 'bananas'
>>> a
array([apples, foobar, bananas], dtype=object)
Действительно, поскольку он представляет собой массив объектов, вы можете назначить любой тип объекта python для массива:
>>> a[2] = {1:2, 3:4}
>>> a
array([apples, foobar, {1: 2, 3: 4}], dtype=object)
Однако это снижает многие преимущества использования numpy, что так быстро, потому что оно работает на больших смежных блоках необработанной памяти. Работа с объектами python добавляет много накладных расходов. Простой пример:
>>> a = numpy.array(['abba' for _ in range(10000)])
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object)
>>> %timeit a.copy()
100000 loops, best of 3: 2.51 us per loop
>>> %timeit b.copy()
10000 loops, best of 3: 48.4 us per loop