[英]Numpy find multiple strings in 2d array
我是 Numpy 的新手,寫 python 已經有一段時間了。
我正在努力在被切片的 Numpy 數組中找到多個字符串。
我的數據:
string0 = "part0-part1-part2-part3-part4"
string1 = "part5-part6-part9-part7-part8"
string2 = "part5-part6-part1-part8-part7"
切片到每個部分並再次組合到一個陣列中,將它們全部放在一個地方。
stringsraw = np.array([[string0], [string1], [string2]])
stringssliced = np.array(np.char.split(stringsraw, sep = '-').tolist())
stringscombined = np.squeeze(np.dstack((stringsraw, stringssliced)))
結果是:
[['part0-part1-part2-part3-part4' 'part0' 'part1' 'part2' 'part3' 'part4']
['part5-part6-part9-part7-part8' 'part5' 'part6' 'part9' 'part7' 'part8']
['part5-part6-part1-part7-part8' 'part5' 'part6' 'part1' 'part8' 'part7']]
想要找到“part1”和“part7”的索引
np.where((stringscombined[2] == "part1") & (stringscombined[2] == "part7"))
結果什么都沒有。 誰能解釋為什么結果不是[3,4]?
認為會有更好的方法來不循環遍歷所有內容。
“whished”查詢/結果將是:
np.where((stringscombined == "part6") & (stringscombined == "part7"))
= array[[1,2,4]
[2,2,5]]
任何幫助表示贊賞
我們可以首先使用 np.isin 檢測這兩個元素的位置:
np.isin(stringscombined,["part1","part7"])
array([[False, False, True, False, False, False],
[False, False, False, False, True, False],
[False, False, False, True, False, True]])
使用np.where()
將告訴我們在哪里可以找到元素。 我們還需要一個信息,即哪一行同時包含“part1”和“part7”:
(np.sum(stringscombined=="part1",axis=1)>0) & (np.sum(stringscombined=="part7",axis=1)>0)
array([False, False, True])
以上將告訴我們僅從第二行獲取索引。 將這兩個信息組合成一個 function:
def index_A(Array,i1,i2):
idx = (np.sum(Array==i1,axis=1)>0) & (np.sum(Array==i2,axis=1)>0)
loc = np.where(np.isin(Array,[i1,i2]))
hits = [np.insert(loc[1][loc[0]==i],0,i) for i in np.where(idx)[0]]
return hits
index_A(stringscombined,"part6","part7")
[array([1, 2, 4]), array([2, 2, 5])]
我們可以通過以下方式簡化尺寸:
In [475]: stringsraw = np.array([string0, string1, string2])
In [476]: stringsraw
Out[476]:
array(['part0-part1-part2-part3-part4', 'part5-part6-part9-part7-part8',
'part5-part6-part1-part8-part7'], dtype='<U29')
In [477]: np.char.split(stringsraw, sep='-')
Out[477]:
array([list(['part0', 'part1', 'part2', 'part3', 'part4']),
list(['part5', 'part6', 'part9', 'part7', 'part8']),
list(['part5', 'part6', 'part1', 'part8', 'part7'])], dtype=object)
In [478]: np.stack(_)
Out[478]:
array([['part0', 'part1', 'part2', 'part3', 'part4'],
['part5', 'part6', 'part9', 'part7', 'part8'],
['part5', 'part6', 'part1', 'part8', 'part7']], dtype='<U5')
In [479]: arr = _
列表理解同樣好(而且很快):
In [491]: [str.split('-') for str in [string0, string1, string2]]
Out[491]:
[['part0', 'part1', 'part2', 'part3', 'part4'],
['part5', 'part6', 'part9', 'part7', 'part8'],
['part5', 'part6', 'part1', 'part8', 'part7']]
In [492]: np.array(_)
Out[492]:
array([['part0', 'part1', 'part2', 'part3', 'part4'],
['part5', 'part6', 'part9', 'part7', 'part8'],
['part5', 'part6', 'part1', 'part8', 'part7']], dtype='<U5')
然后對切片或整個數組進行相等測試:
In [488]: np.nonzero((arr[2]=='part1')|(arr[2]=='part7'))
Out[488]: (array([2, 4]),)
In [489]: arr=='part1'
Out[489]:
array([[False, True, False, False, False],
[False, False, False, False, False],
[False, False, True, False, False]])
In [490]: np.nonzero(_)
Out[490]: (array([0, 2]), array([1, 2]))
In [493]: np.in1d(arr[2],['part1','part7'])
Out[493]: array([False, False, True, False, True])
numpy's
處理沒有什么特別之處。
np.isin
也有效。 它使用in1d
。 如果一個參數很小,它實際上會重復|
如[488]:
In [501]: np.isin(arr,['part1','part7'])
Out[501]:
array([[False, True, False, False, False],
[False, False, False, True, False],
[False, False, True, False, True]])
In [502]: np.nonzero(_)
Out[502]: (array([0, 1, 2, 2]), array([1, 3, 2, 4]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.