If you don't mind working with NumPy arrays, you can use broadcastingfor a vectorized solution. Here's the implementation -
tol = [1, 2, 10]
diffs = np.abs(np.asarray(a[:,None]) - np.asarray(b))
x1,x2 = np.nonzero((diffs < tol).all(2))
Run Example -
In [46]:
...: a=np.matrix('1 5 1003; 2 4 1002; 4 3 1008; 8 1 2005')
...: b=np.matrix('7 9 1006; 4 4 1007; 7 7 1050; 8 2 2003; 9 9 3000; 7 7 1000')
...:
In [47]:
...: tol = [1, 2, 10]
...:
...:
...: diffs = np.abs(np.asarray(a[:,None]) - np.asarray(b))
...:
...:
...:
...: x1,x2 = np.nonzero((diffs < tol).all(2))
...:
In [48]: x1,x2
Out[48]: (array([2, 3]), array([1, 3]))
:. , , , - 3, 3 , -
na = a.shape[0]
nb = b.shape[0]
accum = np.ones((na,nb),dtype=bool)
for i in range(a.shape[1]):
accum &= np.abs((a[:,i] - b[:,i].ravel())) < tol[i]
x1,x2 = np.nonzero(accum)