用字符串了解NumPy dtype“ c”

时间:2018-10-24 10:58:04

标签: python arrays numpy char

目标:将str转换为大小为1的np.ndarray的{​​{1}}:

bytes

不带dtype的实际结果:import numpy as np np.array("abc", dtype=[whatever])

所需结果: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') 可能表示'char'

我不了解的地方'c'为什么按原样工作?根据{{​​3}},dtype='c'是“复杂浮点”的缩写,而'c'是长度为1的“零终止字节(不推荐)”。

也直接将'| S1'用作'|S1'会忽略每个字符,但会忽略第一个字符,这不是我期望的,但是我想它只是将dtype作为一个参数,而将{{1 }}是仅将"abc"指定为一个字节的结果:

b'a'

问题:

  1. dtype为什么按原样工作?
  2. (如果np.array("abc", dtype='|S1') # array(b'a', dtype='|S1') 只是“偶然地”工作,那么这样做的“正确方法”是什么?)

PS: 是的,有一个arrays.dtypes reference,但是根据链接的文档:

  

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

但是,推荐的dtypes dtype='c'dtype='c'object_不会将字符串拆分为字符,而是返回一个元素的string_

1 个答案:

答案 0 :(得分:1)

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

>>> 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')

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

Imho,完成任务的正确方法是:

np.array(list('abc'), dtype='S1')