【发布时间】:2019-03-28 18:23:18
【问题描述】:
目标:将str 转换为np.ndarray of 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' 可能意味着“字符”
我不明白的地方:
为什么dtype='c' 会这样工作?根据arrays.dtypes reference,'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 模块中的 free 函数进行快速向量化字符串操作。
但是推荐的 dtypes object_、string_ 和 unicode_ 不要将字符串拆分为字符,而是返回带有一个元素的 ndarray。
【问题讨论】:
-
'c' 列在
'Array-protocol type strings (see The Array Interface)'部分下,其中字母必须后跟尺寸编号,如np.dtype('c16')。它不适用于 Python 代码中的独立 'c' 字符串。np.typecodes['Character']返回“c”。 -
还比较
np.dtype('c')、np.dtype('c8')、npdtype('c4')(错误)、np.dtype('S3')。 -
@hpaulj 我知道我使用
'c'的结果不是复数,而是字节字符。但即使np.typecodes['Character']返回'c',np.array("abc", dtype=np.character)也不会返回与np.array("abc", dtype='c')相同的结果。