Matrix match in python

python matrix
python matrix operations
column matrix in python
python print matrix
numpy matrix
add two matrix in python using numpy
find element in matrix python
n*n matrix in python

How can I find the best "match" for small matrix in big matrix? For example:

 small=[[1,2,3],
        [4,5,6],
        [7,8,9]]



    big=[[2,4,2,3,5],
         [6,0,1,9,0],
         [2,8,2,1,0],
         [7,7,4,2,1]]

The match is defined as difference of numbers in matrix, so match in position (1,1) is as if number 5 from small would be on number 0 from big matrix (so the central number from small matrix in coordinates (1,1) of big matrix.

The match value in position (1,1) is: m(1,1)=|2−1|+|4−2|+|2−3|+|6−4|+|0−5|+|1−6|+|2−7|+|8−8|+|2−9|=28

The goal is to find the lowest difference posible in those matrixes.

The small matrix always has odd number of lines and columns, so it's easy to find it's centre.

You can iterate through the viable rows and columns and zip the slices of big with small to calculate the sum of differences, and use min to find the minimum among the differences:

from itertools import islice
min(
    (
        sum(
            sum(abs(x - y) for x, y in zip(a, b))
            for a, b in zip(
                (
                    islice(r, col, col + len(small[0]))
                    for r in islice(big, row, row + len(small))
                ),
                small
            )
        ),
        (row, col)
    )
    for row in range(len(big) - len(small) + 1)
    for col in range(len(big[0]) - len(small[0]) + 1)
)

or in one line:

min((sum(sum(abs(x - y) for x, y in zip(a, b)) for a, b in zip((islice(r, col, col + len(small[0])) for r in islice(big, row, row + len(small))), small)), (row, col)) for row in range(len(big) - len(small) + 1) for col in range(len(big[0]) - len(small[0]) + 1))

This returns: (24, (1, 0))

Python, Numpy is the de facto ndarray tool for the Python scientific ecosystem. print np.​hstack([a2,a2]) # arrays must match shape # >> [[1 2 1 2] # [3 4 3 4]] print  Slicing a Matrix. A matrix slice is selecting a sub-matrix. Python provides a wonderful syntax to index and slice matrices. Slicing uses below syntax: matrix[row index range, column index range, step number] Row and column index ranges follow standard python syntax begin index: end index

Done by hand:

small=[[1,2,3],
       [4,5,6],
       [7,8,9]]


big=[[2,4,2,3,5],
     [6,0,1,9,0],
     [2,8,2,1,0],
     [7,7,4,2,1]]

# collect all the sums    
summs= [] 

# k and j are the offset into big

for k in range(len(big)-len(small)+1):
    # add inner list for one row
    summs.append([])
    for j in range(len(big[0])-len(small[0])+1):
        s = 0
        for row in range(len(small)):
            for col in range(len(small[0])):
                s += abs(big[k+row][j+col]-small[row][col])
        # add to the inner list
        summs[-1].append(s)

print(summs)

Output:

[[28, 29, 38], [24, 31, 39]]

If you are just interested in the coords in the bigger one, store tuples of (rowoffset,coloffset,sum) and dont box lists into lists. You can use min() with a key that way:

summs = []
for k in range(len(big)-len(small)+1):
    for j in range(len(big[0])-len(small[0])+1):
        s = 0
        for row in range(len(small)):
            for col in range(len(small[0])):
                s += abs(big[k+row][j+col]-small[row][col])
        summs .append( (k,j,s) )  # row,col, sum

print ("Min value for bigger matrix at ", min(summs , key=lambda x:x[2]) )

Output:

Min value for bigger matrix at  (1, 0, 24)

If you had "draws" this would only return the one with minimal row, col offset.

Working With Numpy Matrices: A Handy First Reference, The column key type of the matrix table must match the key type of other . This method does not change the Remove columns where s is found in a Python set​:. Python | Get match indices Sometimes, while working with lists we need to handle two lists and search for the matches, and return just the indices of the match. Querying the whole list for this process is not feasible when the size of master list is very large, hence having just the match indices helps in this cause.

Another possible solution would be this, returning the minimum difference and the coordinates in the big matrix:

small=[[1,2,3],
       [4,5,6],
       [7,8,9]]

big=[[2,4,2,3,5],
     [6,0,1,9,0],
     [2,8,2,1,0],
     [7,7,4,2,1]]

def difference(small, matrix):
    l = len(small)
    return sum([abs(small[i][j] - matrix[i][j]) for i in range(l) for j in range(l)])

def getSubmatrices(big, smallLength):
    submatrices = []
    bigLength = len(big)
    step = (bigLength // smallLength) + 1
    for i in range(smallLength):
        for j in range(step):
            tempMatrix = [big[j+k][i:i+smallLength] for k in range(smallLength)]
            submatrices.append([i+1,j+1,tempMatrix])
    return submatrices

def minDiff(small, big):
    submatrices = getSubmatrices(big, len(small))
    diffs = [(x,y, difference(small, submatrix)) for x, y, submatrix in submatrices]
    minDiff = min(diffs, key=lambda elem: elem[2])
    return minDiff

y, x, diff = minDiff(small, big)

print("Minimum difference: ", diff)
print("X = ", x)
print("Y = ", y)

Output:

Minimum difference:  24
X =  1
Y =  2

MatrixTable, The match score indicates the compatibility between an alignment of two can also use known matrices already included in Biopython (MatrixInfo from Bio. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. Learn more Finding the indices of matching elements in list in Python

I would use numpy to help with this.

To start I would convert the arrays to numpy arrays

import numpy as np

small = np.array([[1,2,3], [4,5,6], [7,8,9]])
big = np.array([[2,4,2,3,5], [6,0,1,9,0], [2,8,2,1,0], [7,7,4,2,1]])

then I would initialize an array to store the results of the test (optional: a dictionary as well)

result_shape = np.array(big.shape) - np.array(small.shape) + 1
results = np.zeros((result_shape[0], result_shape[1]))
result_dict = {}

Then iterate over the positions in which the small matrix can be positioned over the large matrix and calculate the difference:

insert = np.zeros(big.shape)
for i in range(results.shape[0]):
    for j in range(results.shape):
        insert[i:small.shape[0] + i, j:small.shape[1] + j] = small
        results[i, j] = np.sum(np.abs(big - insert)[i:3+i, j:3+j])
        # Optional dictionary 
        result_dict['{}{}'.format(i, j)] = np.sum(np.abs(big - insert)[i:3+i, j:3+j])

Then you can print(results) and obtain:

[[ 28.  29.  38.]
 [ 24.  31.  39.]]

and/or because the position of the small matrix over the big matrix is stored in the keys of the dictionary, you can get the position of the small matrix over the large matrix where the difference is smallest by key manipulation:

pos_min = [int(i) for i in list(min(result_dict, key=result_dict.get))]

and if you print(pos_min), you obtain:

[1, 0]

then if you need the index for anything you can iterate over it if required. Hope this helps!

Bio.pairwise2, Compute feature matches for an image pair and estimate the fundamental matrix. Use the epipolar lines to do a second pass to find more matches by searching  The matrix product of two matrices can be calculated if the number of columns of the left matrix is equal to the number of rows of the second or right matrix. The product of a (l x m)-matrix A = (a ij ) i=1l, j= 1..m and an (m x n)-matrix B = (b ij ) i=1m, j= 1..n is a matrix C = (c ij ) i=1l, j= 1..n , which is calculated like this:

Programming Computer Vision with Python: Tools and Algorithms for , Prerequisites: You'll need Python 2.6+, PyTables, and NumPy. To retrieve the list of matrices that matches a given set of tags, pass in a tuple of tags when  Fuzzy String Matching in Python In this tutorial, you will learn how to approximately match strings and determine how similar they are by going over various examples. Have you ever wanted to compare strings that were referring to the same thing, but they were written slightly different, had typos or were misspelled?

Python API - open model data, getAt (name, row, col), Access an element from a Mata matrix. the dimensions of the matrix. any of the value types specified in val do not match the matrix type. Return a tuple containing all the subgroups of the match, from 1 up to however many groups are in the pattern. The default argument is used for groups that did not participate in the match; it defaults to None. (Incompatibility note: in the original Python 1.5 release, if the tuple was one element long, a string would be returned instead.

Mata (sfi.Mata), In our implementation the potential matches will be stored using a Python For convenience, in the explanation of the method, the matrix notation will be used  Arrays are usually referred to as lists. For convience, lets call them arrays in this article. Python has a method to search for an element in an array, known as index (). Arrays start with the index zero (0) in Python: If you would run x.index (‘p’) you would get zero as output (first index).

Comments
  • Such template matching almost certainly exists in opencv already.
  • nicely described - where is what you coded to try to solve that?
  • Please do not vandalize your posts. By posting on the Stack Exchange network, you've granted a non-revocable right for SE to distribute that content (under the CC BY-SA 3.0 license). By SE policy, any vandalism will be reverted.
  • pylint: line too long.
  • I've updated the answer with a broken down version then.
  • Like your solution! Although having some issues: for matrix
  • @IvanHlivan I see. I've put your sample data here: repl.it/repls/FrontFoolhardyExtraction and as you can see (by clicking on the Run button), the smallest difference does occur at (0, 16). How did you come to the conclusion that it should be (5, x)? And what is this "x" in (5, x) anyway?
  • Sorry, my fault. Compared other results.