pattern = [[1,0,0,1,0], [1,1,0,0,0], [1,0,0,0,0], [1,0,0,0,0], [1,0,0,0,1], [1,0,1,0,0], [1,0,0,0,0]] patterns_1 = [ [[1,0,0,0,0], [0,1,0,0,0], [0,0,1,0,0], [0,0,0,1,0], [0,0,0,0,1], [1,0,0,1,0], [1,0,0,0,0]], [[1,0,0,0,0], [0,1,0,0,0], [1,0,1,0,0], [0,0,0,1,0], [0,0,0,0,1], [1,0,0,1,0], [0,0,0,0,0]], [[1,0,0,0,0], [0,1,0,0,0], [1,0,1,0,0], [0,0,0,1,0], [0,0,0,0,1], [1,0,0,1,0], [0,0,0,0,0]] ] patterns_2 = [ [[1,0,0,0,0], [1,1,0,0,0], [1,0,1,0,0], [1,0,0,1,0], [1,0,0,0,1], [1,0,0,1,0], [1,0,0,0,0]], [[1,0,0,0,0], [1,1,0,0,0], [1,0,1,0,0], [1,0,0,1,0], [1,0,0,0,1], [1,0,0,1,0], [1,0,0,0,0]], [[1,0,0,0,0], [1,1,0,0,0], [1,0,1,0,0], [1,0,0,1,0], [1,0,0,0,1], [1,0,0,1,0], [1,0,0,0,0]] ] def checkSum_1(pattern): rows = len(pattern) cols = len(pattern[0]) sumCols = [0 for _ in range(cols)] sumRows = [0 for _ in range(rows)] for c in range(0, cols): for r in range(0, rows): sumCols[c] += pattern[r][c] sumRows[r] += pattern[r][c] return sumCols + sumRows def fingerprintForSum_1(patterns): sumTotal = None for pattern in patterns: s = checkSum_1(pattern) if sumTotal == None: sumTotal = s else: sumTotal = [x + y for x, y in zip(sumTotal, s)] l = len(patterns) return [x/l for x in sumTotal] def match(pattern, fingerprints): best = None bestDist = 0.0 s = checkSum_1(pattern) for idF in range(len(fingerprints)): f = fingerprints[idF] dist = 0 for i in range(len(f)): dist += (f[i]-s[i])*(f[i]-s[i]) if best == None: best = idF bestDist = dist else: if dist < bestDist: best = idF bestDist = dist return (best, bestDist) f1 = fingerprintForSum_1(patterns_1) f2 = fingerprintForSum_1(patterns_2) myAllFingerprints = [f1, f2] s = checkSum_1(pattern) r = match(pattern, myAllFingerprints) print(r)