Вы можете видеть это как форму переполнения.
Посмотрите на точные типы ваших массивов:
>>> a.dtype
dtype('<U1') # Array of 1 unicode char
>>> b.dtype
dtype('<U4') # array of 4 unicode chars
Когда вы определяете массив строк, numpy
пытается вывести наименьший размер строки, который может содержать все элементы, которые вы определили.
- для
a
, достаточно 1 символа - для
b
, TEST
длиной 4 символа
Затем, когда вы назначаете новое значение любому новому элементу массива строк, numpy будет усекать новое значение до емкости массива. Здесь он сохраняет только первую букву TEST
, T
.
Ваша операция среза не имеет к этому никакого отношения:
a = np.zeros(1, dtype=str)
a[0] = 'hello world'
print(a[0])
# h
Как ее преодолеть
- определить
a
с dtype объекта : numpy больше не будет пытаться оптимизировать свое пространство хранения, и вы получите предсказуемое поведение - Увеличение размера массива char :
a = np.zero(10, dtype='U256')
увеличит емкость каждой ячейки до 256 символов