【问题标题】:numpy char.array get set of characters from a stringnumpy char.array 从字符串中获取字符集
【发布时间】:2017-08-05 07:41:38
【问题描述】:

这是我的 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")i可以得到.NS在字符串中的索引位置。但是我怎样才能使用它来获得所需的输出呢?

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

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

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

编辑_1/ 这就是我如何通过索引获得结果,但我不能同时在整个数组上这样做

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

【问题讨论】:

  • 您要查找的字符串是否总是7 字符?他们后面会不会总是跟着那个字符串'/finance/stocks/overview?symbol='
  • 是的,在这种情况下,它们将遵循固定模式。
  • 总是7 个字符?
  • 是的,要选择的字符串为 7 个字符。 (会有变化(最多 8 个字符,其中一些代码的长度为 5 而不是 4 个字符),但在这一点上,我将忽略它,因为它可能占整个数据集的 2% 左右)。跨度>
  • char 函数(在本例中为chararray 方法)只需将相应的string 方法应用于数组的每个元素。与显式循环相比,它们并没有加快速度。我建议在列表理解中应用您自己的字符串操作。

标签: python regex string numpy


【解决方案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

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

【讨论】:

    【解决方案2】:

    使用来自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')
    

    【讨论】:

    • 你是最棒的。
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多