Numpy массив строк, присвоение значения - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю с numpy массивами, заполненными строками. Моя цель - присвоить срезу первого массива a значения, содержащиеся во втором массиве b меньшего размера.

Реализация, которую я имел в виду, следующая:

import numpy as np

a = np.empty((10,), dtype=str)

b = np.array(['TEST' for _ in range(2)], dtype=str)

print(b)

a[1:3] = b

print(a)

print(b) возвращается, как и ожидалось ['TEST' 'TEST']

Но тогда print(a) возвращает ['' 'T' 'T' '' '' '' '' '' '' '']. Поэтому значения из b не правильно назначены срезу a.

Любое представление о том, что вызывает этот волшебник dry?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Вы можете видеть это как форму переполнения.

Посмотрите на точные типы ваших массивов:

>>> 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

Как ее преодолеть

  1. определить a с dtype объекта : numpy больше не будет пытаться оптимизировать свое пространство хранения, и вы получите предсказуемое поведение
  2. Увеличение размера массива char : a = np.zero(10, dtype='U256') увеличит емкость каждой ячейки до 256 символов
1 голос
/ 17 апреля 2020

Проблема в том, что numpy усекает строку до длины 1 при указании dtype=str.

. Однако вы можете решить эту проблему, используя dtype='<U4'.

код будет работать для вашего случая:

import numpy as np

a = np.empty((10,), dtype='<U4')

b = np.array(['TEST' for _ in range(2)], dtype=str)

print(b)

a[1:3] = b

print(a)

Число в dtype='<U4' указывает максимально возможную длину строки в этом массиве - поэтому для вашего случая 4 хорошо, так как 'TEST' имеет только 4 букв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...