2017-10-18 29 views
0

我有兩個1D numpy的陣列A(小的)和B(大)numpy的:搜索與在一個較大的陣列乙相同圖案陣列的

A=np.array([6,7,8,9,10]) 

B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]) 

我想檢查,如果我們有的元素在陣列B.被檢測以相同的順序數組A 獲得從陣列B的索引值,其中我們檢測陣列的起始阿

Index Value returned = 6 

我們是否有任何內在numpy的函數來執行這樣的操作?

+0

只是爲了檢查 - 你的意思是,如果它是一個確切的子陣列...例如:如果B = [...,6,7,8,9,11,10] - 是否匹配? –

+0

@JonClements是的,你說得對。這正是我的意思。 – Santhosh

回答

0

我找到了一個很好的解決方案。

通過@EdSmith在Finding Patterns in a Numpy Array

鑑於總之這是該過程

  • 陣列的短的長度被搜索的。(我的實施例A)
  • 檢查通過該陣列的整個長度(在我的例子B中),使用np.where和np.all

這不是我的代碼,而是可以在about鏈接中找到的代碼,Simpl簡單易行。我只是改變了一點,以適應上述希望我的例子也可以幫助別人:)

由於@EdSmith

import numpy as np 

A=np.array([6,7,8,9,10]) 

B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]) 

N = len(A) 
possibles = np.where(B == A[0])[0] 

solns = [] 
for p in possibles: 
    check = B[p:p+N] 
if np.all(check == A): 
    solns.append(p) 

print(solns) 

輸出繼電器

[6] 
1

我也有時遇到過這個問題。我認爲特別是對於大的numpy數組最快的方法是將它們轉換爲字符串,然後執行它。 這裏是我使用的代碼:

b=np.array([6,7,8,9,10])  
a=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]) 
a.tostring().index(b.tostring())//a.itemsize 
+0

不錯,臨時修復。對於數組中的少量元素。我會處理數組中的大量元素。我懷疑這將是一種有效的方式,通過查看需要先轉換爲字符串並存儲在虛擬內存中的數據量。 – Santhosh

0

試試這個:

import numpy as np 
A=np.array([6,7,8,9,10]) 
B=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,10]) 
r = np.ones_like(B) 
for x in range(len(A)):r*=np.roll((B==A[x]),-x) 
#first index, answer: /6/ 
print(np.where(r)[0][0])