python - 获取 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 中,安全也将测试强制转换是否会导致截断),但它实际上仍然没有解决测试字符大小的问题。
解决方案
4
inU4
是每个元素的字符串长度,而不是字符的大小:
第一个字符指定数据的类型,其余字符指定每个项目的字节数,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 个字节)。
推荐阅读
- jquery - 如何在jquery中组合两个不同的媒体查询
- java - 无法在 Spring Boot 应用程序中将数据插入 Redshift 数据库
- ios - CollectionViewCellClass 中的 ImageView IBOOutlet 返回直到尝试通过 cellforitemat 对其进行初始化
- rasa-nlu - 将 FAQ JSON 文件转换为 RASA nlu 和故事文件
- linux - 一旦我把烧瓶应用程序放到 linux 服务器上,如何修改它?
- angular - 如何以角度8显示文件
- php - yii2 身份会话到期
- javascript - 使用 JavaScript 将带有数组的 JSON 文件上传到不同的选项卡
- iptables - 怎么办:iptables 丢弃碎片?
- apache-flink - Flink MapState 在 TTL 清理期间清理映射键的整个值