这是我的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)
我可以在单个字符串元素上使用str
或regex
来获得所需的输出,但这需要在数组上运行for循环。我怎么能单独在numpy中做到这一点?感谢。
edit_1 / 这是我如何通过索引获得结果但我无法在整个数组上同时进行
table[0][0][32:38]
Out[75]: 'TMIN.N'
答案 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')