我只是想在创建
unicode
时确认字符串的默认数据类型是否为 ndarray
。我找不到任何明确说明这一点的参考资料。也许这太明显了,不需要说明。
指定 dtype 时:
>>> import numpy as np
>>> g = np.array([['a', 'b'],['c', 'd']], dtype='S')
>>> g
array([[b'a', b'b'],
[b'c', b'd']],
dtype='|S1')
不指定数据类型:
>>> g = np.array([['a', 'b'],['c', 'd']])
>>> g
array([['a', 'b'],
['c', 'd']],
dtype='<U1')
此外,当指定 dtype 时,文字
b
表示什么。根据文档,它表示 bool
,但这里似乎并非如此。
有人可以澄清一下吗?
b'...'
表示它是字节字符串,字符串数组的默认数据类型取决于字符串的类型。 Unicode(python 3 字符串是 unicode)是 U
,Python 2 str
或 Python 3 bytes
具有 dtype S
。您可以在此处的 NumPy 文档中找到 dtypes 的解释
数组协议类型字符串
第一个字符指定数据类型,其余字符指定每个项目的字节数,Unicode 除外,在 Unicode 中它被解释为字符数。项目大小必须与现有类型相对应,否则将引发错误。支持的种类有:
- '?' 布尔值
- 'b'(有符号)字节
- ‘B’无符号字节
- 'i'(有符号)整数
- ‘u’无符号整数
- 'f'浮点
- 'c' 复数浮点
- 我的时间增量
- “M”日期时间
- “O”(Python)对象
- 'S'、'a' 以零结尾的字节(不推荐)
- “U”Unicode 字符串
- 'V'原始数据(无效)
但是,在第一种情况下,您实际上强制 NumPy 将其转换为字节,因为您指定了
dtype='S'
。
numpy.dtypes.StringDType
可用。
现实世界中的字符串数据通常没有可预测的长度。在这些情况下,使用固定宽度字符串很尴尬,因为在不截断的情况下存储所有数据需要在创建数组之前知道要存储在数组中的最长字符串的长度。
为了支持此类情况,NumPy 提供了
numpy.dtypes.StringDType
,它将可变宽度字符串数据以 UTF-8 编码存储在 NumPy 数组中:
from numpy.dtypes import StringDType
data = ["this is a longer string", "short string"]
arr = np.array(data, dtype=StringDType())
arr
array(['this is a longer string', 'short string'], dtype=StringDType())
请注意,与固定宽度字符串不同,
StringDType
不通过数组元素的最大长度进行参数化,任意长或短的字符串可以存在于同一个数组中,而无需为短字符串中的填充字节保留存储空间。