理解带有字符串的 NumPy dtype "c"

Nik*_*sch 5 python arrays numpy char

目标:转换strnp.ndarray大小bytes1:

import numpy as np
np.array("abc", dtype=[whatever])
Run Code Online (Sandbox Code Playgroud)

没有数据类型的实际结果: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')
Run Code Online (Sandbox Code Playgroud)

我通过反复试验发现了这个,认为这'c'可能意味着“char”

我不明白的是: 为什么要dtype='c'这样工作?根据arrays.dtypes 参考,'c'是“复数浮点”的缩写,而'|S1'是长度为 1 的“零终止字节(不推荐)”。

还直接使用“|S1”作为dtype忽略除第一个字符之外的每个字符,这不是我所期望的,但我想它只是将作为"abc"一个参数,并且b'a'如果仅将单个字节指定为dtype

np.array("abc", dtype='|S1')
# array(b'a', dtype='|S1')
Run Code Online (Sandbox Code Playgroud)

问题):

  1. 为什么会dtype='c'这样工作?
  2. (如果dtype='c'只是“偶然”工作,那么“正确的方法”是什么?)

PS: 是的,有一个np.chararray,但根据链接的文档:

chararray 类的存在是为了向后兼容 Numarray,不建议用于新开发。从 numpy 1.4 开始,如果需要字符串数组,建议使用 dtype object_、string_ 或 unicode_ 的数组,并使用 numpy.char 模块中的 free 函数进行快速向量化字符串操作。

但是建议使用 dtypes object_string_并且unicode_不要将字符串拆分为字符,而是返回ndarray带有一个元素的 a 。

And*_*dyK 2

对我来说这似乎是一个错误。请注意,如果您没有指定字符代码“c”之后的字节数,则数据类型实际上是“S1”,而不是复杂的浮点数。查看数据类型的这些属性:

>>> dt_S1 = np.dtype('S1')
>>> dt_S1, dt_S1.kind, dt_S1.name, dt_S1.char
(dtype('S1'), 'S', 'bytes8', 'S')

>>> dt_c = np.dtype('c')
>>> dt_c, dt_c.kind, dt_c.name, dt_c.char))
(dtype('S1'), 'S', 'bytes8', 'c')

>>> dt_c8 = np.dtype('c8')
>>> dt_c8, dt_c8.kind, dt_c8.name, dt_c8.char
(dtype('complex64'), 'c', 'complex64', 'F')
Run Code Online (Sandbox Code Playgroud)

因此,人们会期望 fornp.array('abc', dtype='c')np.array('abc', dtype='S1')返回相同的结果array(b'a', dtype='S1'),或者前者会给出错误np.array('abc', dtype='c8')

恕我直言,完成任务的正确方法是:

np.array(list('abc'), dtype='S1')
Run Code Online (Sandbox Code Playgroud)