numpy char.array从字符串中获取字符集

时间:2017-03-14 19:34:34

标签: python regex string numpy

这是我的numpy.char.array

table = np.char.arrray([['/finance/stocks/overview?symbol=TMIN.NS&exchange=INSE'],
['/finance/stocks/overview?symbol=8KMS.BO&exchange=INB'],
['/finance/stocks/overview?symbol=ADRG.NS&exchange=INSE']],dtype='|S53')

如何获得以下所需的输出:

out = ['TMIN.NS','8KMS.BO','ADRG.NS']

使用table.find(".NS")我可以在字符串中获得.NS的索引位置。但是我如何使用它来获得所需的输出?

In [69]: table.find(".NS")
Out[69]: 
       array([[36],
             [-1],
             [36],
             ..., 
             [36],
             [36],
             [36]])

原因,简单的基于索引的选择不起作用是因为,整个字符串只是单个元素。数组的形状为(30L,1L)

我可以在单个字符串元素上使用strregex来获得所需的输出,但这需要在数组上运行for循环。我怎么能单独在numpy中做到这一点?感谢。

edit_1 / 这是我如何通过索引获得结果但我无法在整个数组上同时进行

table[0][0][32:38]
Out[75]: 'TMIN.N'

2 个答案:

答案 0 :(得分:1)

np.char函数/方法不会加快速度 - 它们只是遍历元素应用相应的字符串方法。

In [261]: timeit [astr.find(".NS") for astr in table.flat]
....
100000 loops, best of 3: 3.92 µs per loop
In [262]: timeit table.find(".NS")
....
100000 loops, best of 3: 11.6 µs per loop

所以定义一个简单的函数来隔离所需的子字符串(几个可能的路由之一),

def extract(astr):
    astr=astr.split('?')[1].split('&')[0]
    astr = astr.split('=')[1]
    return astr

In [268]: [extract(astr) for astr in table.flat]
Out[268]: ['TMIN.NS', '8KMS.BO', 'ADRG.NS']
In [269]: timeit [extract(astr) for astr in table.flat]
100000 loops, best of 3: 8.98 µs per loop

一般观察是,对于小数组/列表,列表理解路由通常比等效数组快。数组操作随着大小变得更好。

答案 1 :(得分:0)

使用来自this post的字符串dtypes的NumPy数组的矢量化切片方法 -

In [149]: search_pattern = '/finance/stocks/overview?symbol='

In [150]: pruned_table = np.chararray.replace(table, search_pattern,'')

In [151]: slicer_vectorized(pruned_table, 0, 7)
Out[151]: 
array(['TMIN.NS', '8KMS.BO', 'ADRG.NS'], 
      dtype='|S7')

或者,既然我们知道我们正在寻找的字符串就在search_pattern之后,我们可以直接在该模式的长度之后查找它,就像这样 -

In [167]: N  = len(search_pattern)

In [168]: slicer_vectorized(table, N,N+7)
Out[168]: 
array(['TMIN.NS', '8KMS.BO', 'ADRG.NS'], 
      dtype='|S7')