有没有办法根据每个元素的字符数以矢量化的方式拆分Numpy数组?
输入:
In [1]: import numpy as np
In [2]: y = np.array([ 'USC00013160194806SNOW','USC00013160194806SNOW','USC00013160194806SNOW' ])
In [3]: y
Out[3]:
array(['USC00013160194806SNOW', 'USC00013160194806SNOW',
'USC00013160194806SNOW'],
dtype='|S21')
我希望根据一定数量的字符拆分数组的每个元素。
期望输出:
In [3]: y
Out[3]:
array(['USC00013160', 'USC00013160',
'USC00013160'],
dtype='|S21')
我使用标准的python循环执行此操作,但我处理了数百万的值,所以我试图找出最快的方法。
答案 0 :(得分:1)
您可以使用与y
的dtype相同大小的数据类型创建视图,该类型具有与您想要的部分对应的子字段。例如,
In [22]: y
Out[22]:
array(['USC00013160194806SNOW', 'USC00013160194806SNOW',
'USC00013160194806SNOW'],
dtype='|S21')
In [23]: dt = np.dtype([('part1', 'S11'), ('part2', 'S6'), ('part3', 'S4')])
In [24]: v = y.view(dt)
In [25]: v['part1']
Out[25]:
array(['USC00013160', 'USC00013160', 'USC00013160'],
dtype='|S11')
In [26]: v['part2']
Out[26]:
array(['194806', '194806', '194806'],
dtype='|S6')
In [27]: v['part3']
Out[27]:
array(['SNOW', 'SNOW', 'SNOW'],
dtype='|S4')
请注意,这些是y
中相同数据的所有视图。如果您在适当的位置修改它们,则还要修改y
。例如,
In [32]: v3 = v['part3']
In [33]: v3
Out[33]:
array(['SNOW', 'SNOW', 'SNOW'],
dtype='|S4')
将v3[1]
更改为'RAIN'
:
In [34]: v3[1] = 'RAIN'
In [35]: v3
Out[35]:
array(['SNOW', 'RAIN', 'SNOW'],
dtype='|S4')
现在看到y[1]
也发生了变化:
In [36]: y
Out[36]:
array(['USC00013160194806SNOW', 'USC00013160194806RAIN',
'USC00013160194806SNOW'],
dtype='|S21')
答案 1 :(得分:0)
一种可能的解决方案我发现只是使用Pandas系列完成操作,但我想知道是否可以使用 仅使用Numpy来完成此操作数组切片方法 。如果没有,那就很好,对最佳实践更加好奇。
启动Pandas系列:
In [33]: x = pd.read_csv("data.txt", delimiter='\n', dtype=str, squeeze=True)
In [34]: x
Out[34]:
0 USC00013160194807SNOW
1 USC00013160194808SNOW
2 USC00013160194809SNOW
3 USC00013160194810SNOW
4 USC00013160194811SNOW, dtype: object
基于字符数的矢量化字符串处理:
In [37]: k = x.str[0:11]
<强>输出:强>
In [38]: k
Out[38]:
0 USC00013160
1 USC00013160
2 USC00013160
3 USC00013160
4 USC00013160