#how does this work? return sum( pattern == [ row[ j:j + ncols ] for row in area[ i:i + nrows ] ] for i in xrange( len( area ) - nrows + 1 ) for j in xrange( len( area[i] ) - ncols + 1 ) )
The generator expression can be rewritten using explicit for-loop blocks:
count = 0 for i in xrange( len( area ) - nrows + 1 ): for j in xrange( len( area[i] ) - ncols + 1 ): count += (pattern == [ row[ j:j + ncols ] for row in area[ i:i + nrows ] ]) return count
Comparison ( pattern == .. ) returns True / False equal to 1/0 in Python.
Understanding the list that creates submatrices for comparison with a template can be optimized to return earlier:
count += all(pattern_row == row[j:j + ncols] for pattern_row, row in zip(pattern, area[i:i + nrows]))
Or using explicit blocks for the loop:
for pattern_row, row in zip(pattern, area[i:i + nrows]): if pattern_row != row[j:j + ncols]: break
source share