Лучший способ получить длину numpy unicode строки dtype - PullRequest
2 голосов
/ 26 сентября 2019

Я пытаюсь определить максимальную длину элемента массива юникодов.Например, если у меня есть:

# (dtypes added for clarity)
a = np.array(['a'], dtype='U5')
print(get_dtype_length(a))

Я бы хотел напечатать 5.

Я могу сделать что-то вроде:

def get_dtype_length(a):
  dtype = a.dtype
  dtype_string = dtype.descr[0][1]  # == '<U5'
  length = int(dtype_string[2:])
  return length

Но этокажется окольным способом сделать вывод о том, что должно быть где-то доступно.Есть ли у меня атрибут или функция numpy, которая не смогла бы сделать это напрямую?

Уточнение на основе комментариев:

Я специально ищу максимально допустимую длинулюбого элемента в массиве, а не длины какого-либо конкретного элемента (например, не len(a[0]) == 1. Мотивация этого заключается в том, что если я пытаюсь обновить что-то вроде a[0] = 'string_longer_than_dtype_of_a', я не хочу, чтобы элемент усекался доstri.

В numpy версии 1.19 я считаю, что np.can_cast(newVal.dtype, a.dtype, casting='safe') будет правильным тестом для моего варианта использования (как в 1.19 safe также будет проверять, приводит ли приведение к результатам усечения), но на самом деле это не такрешить вопрос о тестировании размера персонажа.

1 Ответ

1 голос
/ 26 сентября 2019

4 в U4 - это длина строки для каждого элемента, а не размер символа:

Первый символ указывает тип данных, а остальные символы указываютколичество байтов на элемент, кроме Unicode, где оно интерпретируется как количество символов.

От документы .

Размеродин символ Unicode может быть константой в вашей программе:

 sizeof_numpy_unicode_char = np.dtype('U1').itemsize

Затем вы можете разделить общее число байтов на элемент на эту константу, чтобы получить размеры буфера, используя либо dtype.itemsizeили ярлык ndarray.itemsize:

def get_length(a):
    return a.itemsize // sizeof_numpy_unicode_char

Но размер символов действительно фиксирован (обычно 4 байта).

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