2017-03-14 48 views
1

這是我numpy.char.array字符集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' 
+0

你正在尋找的字符串總是'7'字符?他們總是會跟着那個字符串''/ finance/stocks/overview?symbol =''? – Divakar

+0

是的,在這種情況下,他們將遵循固定模式。 –

+0

總是有'7'字符? – Divakar

回答

0

上使用字符串dtypes的NumPy的陣列的矢量切割方法從this post -

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') 
+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 

的一般觀察是,與小陣列/列出列表解析路線常常比快一個等價的數組。數組操作隨着大小而變得更好。