首页 > 解决方案 > 获取 numpy unicode 字符串 dtype 长度的最佳方法

问题描述

我正在尝试确定 numpy unicode 数组的最大元素长度。例如,如果我有:

# (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 函数?

基于评论的澄清:

我专门寻找数组中任何元素的最大允许长度,而不是任何特定元素的长度(例如, not len(a[0]) == 1。这背后的动机是,如果我尝试通过类似a[0] = 'string_longer_than_dtype_of_a'我不想要的元素来更新 a截断为stri

在 numpy 版本 1.19 中,我相信np.can_cast(newVal.dtype, a.dtype, casting='safe')这对我的用例来说是一个有效的测试(因为在 1.19 中,安全也将测试强制转换是否会导致截断),但它实际上仍然没有解决测试字符大小的问题。

标签: pythonstringnumpy

解决方案


4inU4是每个元素的字符串长度,而不是字符的大小:

第一个字符指定数据的类型,其余字符指定每个项目的字节数,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 个字节)。


推荐阅读