使用Numpy或熊猫的字符计数字符串矢量化分裂

时间:2015-11-15 22:49:09

标签: python arrays string numpy pandas

有没有办法根据每个元素的字符数以矢量化的方式拆分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循环执行此操作,但我处理了数百万的值,所以我试图找出最快的方法。

2 个答案:

答案 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