Странное поведение, инициализирующее массив numpy строковых данных - программирование
Подтвердить что ты не робот

Странное поведение, инициализирующее массив numpy строковых данных

У меня есть некоторые, казалось бы, тривиальные проблемы с numpy, когда массив содержит строковые данные. У меня есть следующий код:

my_array = numpy.empty([1, 2], dtype = str)
my_array[0, 0] = "Cat"
my_array[0, 1] = "Apple"

Теперь, когда я печатаю его с помощью print my_array[0, :], я получаю ответ ['C', 'A'], что явно не является ожидаемым выходом Cat и Apple. Почему это, и как я могу получить правильный вывод?

Спасибо!

4b9b3361

Ответ 1

Numpy требует, чтобы строковые массивы имели фиксированную максимальную длину. Когда вы создаете пустой массив с dtype=str, он устанавливает максимальную длину до 1 по умолчанию. Вы можете видеть, выполняете ли вы my_array.dtype; он покажет "| S1", что означает "односимвольная строка". Последующие назначения в массив усекаются, чтобы соответствовать этой структуре.

Вы можете передать явный тип данных с максимальной длиной, например:

my_array = numpy.empty([1, 2], dtype="S10")

"S10" создаст массив строк длиной 10. Вы должны решить, насколько большой будет достаточно большой, чтобы хранить все данные, которые вы хотите сохранить.

Ответ 2

У меня возникла "ошибка кодека", когда я попытался использовать символ non-ascii с dtype="S10"

Вы также получаете массив с двоичными строками, который меня смутил.

Я думаю, что лучше использовать:

my_array = numpy.empty([1, 2], dtype="<U10")

Ответ 3

Массив строки numpy ограничен фиксированной длиной (по умолчанию длина 1). Если вы не знаете, какую длину вам понадобятся для ваших строк заранее, вы можете использовать dtype=object и получить строки произвольной длины для своих элементов данных:

my_array = numpy.empty([1, 2], dtype=object)

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

Ответ 4

Другой альтернативой является инициализация следующим образом:

my_array = np.array([["CAT","APPLE"],['','']], dtype=str)

Другими словами, сначала вы пишете обычный массив с тем, что хотите, затем вы превращаете его в массив numpy. Тем не менее, это позволит исправить вашу максимальную длину строки до длины самой длинной строки при инициализации. Поэтому, если вы хотите добавить

my_array[1,0] = 'PINEAPPLE'

тогда сохраненная строка будет "PINEA".