目标:将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'
问题:
dtype
为什么按原样工作?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_
。
答案 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')