Santhosh
Santhosh

Reputation: 1672

Numpy: Search for an array A with same pattern in a larger array B

I have two 1D numpy array A(small) and B(large)

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

I want to check if we have elements of the array A in the same order being detected in the array B. Get the index value of array B from where the we detect the starting of array A

Index Value returned = 6

Do we have any inbuilt numpy function to perform such an operation?

Upvotes: 0

Views: 1247

Answers (3)

Yasin Yousif
Yasin Yousif

Reputation: 967

Try this:

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

Upvotes: 0

Santhosh
Santhosh

Reputation: 1672

I found a nice solution.

Given by @EdSmith in Finding Patterns in a Numpy Array

In short this is the process

  • Short the length of array being searched for.(My example A)
  • Check through entire length of the array being searched in(My example B), using np.where and np.all

This is not my code but the code that can be found in the about link, Simple and easy. I'll just alter it a bit to fit my example above Hope it helps someone :)

Thanks to @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]

Upvotes: 0

ubuntu_noob
ubuntu_noob

Reputation: 2365

I have also encountered this problem sometimes.I think the fastest way especially for big numpy arrays would be to convert them to strings and then do it. Here is the code I use:

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

Upvotes: 1

Related Questions