Цель: Преобразовать str
в np.ndarray
из bytes
размера 1:
import numpy as np
np.array("abc", dtype=[whatever])
Фактический результат без dtype: array('abc', dtype='<U3')
Желаемый результат: array([b'a', b'b', b'c'], dtype=[whatever]
Это позволяет мне использовать нарезку, чтобы получить
Обходной путь, который я нашел, но не понимаю:
np.array("abc", dtype='c')
# array([b'a', b'b', b'c'], dtype='|S1')
Я нашел это методом проб и ошибокдумая, что 'c'
может означать 'char'
Что я не понимаю: Почему dtype='c'
работает так, как есть?Согласно ссылка на arrays.dtypes 'c'
- это сокращение от "комплексная точка с плавающей точкой", тогда как '|S1'
- это "байты с нулевым символом в конце (не рекомендуется)" длиной 1.
Также непосредственно используя '| S1' в качестве dtype
игнорирует каждый символ, но первый, что не является тем, что я ожидал, но я думаю, что он просто принимает "abc"
в качестве одного аргумента и b'a'
- это то, что получается, еслитолько один байт указан как dtype
:
np.array("abc", dtype='|S1')
# array(b'a', dtype='|S1')
Вопрос (ы):
- Почему
dtype='c'
работает так, как есть? - (Если
dtype='c'
просто работает "случайно", какой будет "правильный способ" сделать это?)
PS: Да, существует np.chararray , но согласно связанной документации:
Класс chararray существует для обратной совместимости с Numarray, он не рекомендуется для новой разработки.Начиная с numpy 1.4, если нужны массивы строк, рекомендуется использовать массивы dtype object_, string_ или unicode_ и использовать бесплатные функции в модуле numpy.char для быстрых векторизованных строковых операций.
Однако рекомендуемые dtypes object_
, string_
и unicode_
не разбивают строку на символы, а возвращают ndarray
с одним элементом.