2017-10-18 3 views
0

je deux tableau 1D NumPy A (petite) et B (grand)Numpy: Rechercher un Un tableau avec même motif dans un tableau plus grand B

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]) 

Je veux vérifier si nous avons des éléments de la tableau A dans le même ordre d'être détecté dans le B. tableau Obtenez la valeur d'index du tableau B où l'on détecte le début du tableau A

Index Value returned = 6 

avons-nous une fonction numpy intégrée pour effectuer une telle opération ?

+0

Juste pour vérifier - voulez-vous dire si c'est un sous-tableau exact ... ex: si 'B = [..., 6, 7, 8, 9, 11, 10]' - serait-ce une correspondance ou non? –

+0

@JonClements Oui, vous l'avez compris. C'est exactement ce que je veux dire. – Santhosh

Répondre

0

J'ai trouvé une belle solution.

Donné par @EdSmith dans Finding Patterns in a Numpy Array

En bref, ce processus est le

  • court la longueur du tableau recherchée. (Mon exemple A)
  • Vérifiez par longueur du tableau recherché dans (Mon exemple B), en utilisant np.where et np.all

Ce n'est pas mon code, mais le code qui peut être trouvé dans le lien sur le sujet, Simpl e et facile. Je vais le modifier un peu pour adapter mon exemple ci-dessus, il aide quelqu'un l'espoir :)

Merci à @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) 

Ouput

[6] 
1

J'ai également rencontré ce problème parfois. Je pense que le moyen le plus rapide en particulier pour les grands tableaux numpy serait de les convertir en chaînes, puis le faire. Voici le code que j'utilise:

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

Nice, solution temporaire. Pour un petit nombre d'éléments dans un tableau. Je traiterais avec un grand nombre d'éléments dans un tableau. Je doute que ce serait un moyen efficace d'utiliser ensuite, en regardant la quantité de données qui doit être convertie en chaîne et stocker en mémoire virtuelle en premier. – Santhosh

0

Essayez ceci:

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])