Python 将字符串字段的numpy数组转换为数字格式
我有一个字符串数组,分为三个字段:Python 将字符串字段的numpy数组转换为数字格式,python,numpy,Python,Numpy,我有一个字符串数组,分为三个字段: x = np.array([(-1, 0, 1), (-1, 1, 0), (0, 1, -1), (0, -1, 1)], dtype=[('a', 'S2'), ('b', 'S2'), ('c', 'S2')]) 我想将其转换为数值数组(首选项为np.int8),形
x = np.array([(-1, 0, 1),
(-1, 1, 0),
(0, 1, -1),
(0, -1, 1)],
dtype=[('a', 'S2'),
('b', 'S2'),
('c', 'S2')])
我想将其转换为数值数组(首选项为np.int8
),形状为4x3,而不是字段
我的一般方法是将其转换为“S2”类型的4x3数组,然后使用astype
将其数值化。唯一的问题是,我能想到的唯一方法涉及视图
和np.lib.stride\u技巧。as\u stride
,这似乎不是一个非常健壮的解决方案:
y = np.lib.stride_tricks.as_strided(x.view(dtype='S2'),
shape=(4, 3), strides=(6, 2))
z = y.astype(np.int8)
这适用于这里显示的玩具箱,但我觉得必须有一种更简单的方法来解包所有字段都具有相同数据类型的数组。什么是更强大的替代方案?最新版本的numpy 1.16将
结构化添加到了非结构化
,解决了这一问题:
from numpy.lib.recfunctions import structured_to_unstructured
y = structured_to_unstructured(x) # 2d array of 'S2'
z = y.astype(np.int8)
在以前版本的numpy中,您可以组合x.data
和np.frombuffer
,从内存中的相同数据创建另一个数组,而无需使用跨步。但它并没有带来性能提升,因为计算是由从S2
到int8
的转换驱动的
n=1000
def f1(x):
y=np.lib.stride\u tricks.as\u stride(x.view(dtype='S2'),
形状=(n,3),
步幅=(6,2))
返回y.astype(np.int8)
def f2(x):
y=np.frombuffer(x.data,dtype='S2')。重塑((n,3))
返回y.astype(np.int8)
x=np.数组([(i%3-1,(i+1)%3-1,(i+2)%3-1)
对于x范围内的i(n)],
dtype='S2,S2,S2')
z1=f1(x)
z2=f2(x)
断言(z1==z2).all()
使用列表是将结构化数组转换为简单数据类型数组的最可靠方法:np.array(x.tolist(),'int8')
@hpaulij。我可能会选择这个答案,尽管我现在需要第三份数据副本,这让我很困扰。为什么首先是S2?你是怎么读到这个的?@Andy。我问这个问题是为了无耻地剽窃hpaulj提供的答案。@hpaulj。我已经使用了你建议的技巧:我不太担心性能。正如你所说,这种转变将不可避免地占据主导地位。这只是操纵我不确定的字段数组。对我来说,跨步技巧有点像正则表达式。有时我发现自己在结尾时会遇到两个问题。在numpy>=1.16中添加了结构化到非结构化的!谢谢当你问的时候,你所学到的东西是惊人的。不幸的是,我已经投了赞成票:)