Странное поведение, инициализирующее массив 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. Почему это, и как я могу получить правильный вывод?
Спасибо!
Ответы
Ответ 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".