вот что получилось
for row_idx in xrange(RECTANGLE_ROWS - MAGIC_SQUARE_DIMENSION + 1):
for col_idx in xrange(RECTANGLE_COLUMNS - MAGIC_SQUARE_DIMENSION + 1):
row_slice = slice(row_idx, row_idx + MAGIC_SQUARE_DIMENSION)
col_slice = slice(col_idx, col_idx + MAGIC_SQUARE_DIMENSION)
if (MAGIC_SUM != np.sum(rectangle[row_slice, col_idx]) or
MAGIC_SUM != np.sum(rectangle[row_idx, col_slice])):
continue
for row_offset in xrange(1, MAGIC_SQUARE_DIMENSION):
if MAGIC_SUM != np.sum(rectangle[row_idx + row_offset, col_slice]):
continue
for col_offset in xrange(1, MAGIC_SQUARE_DIMENSION):
if MAGIC_SUM != np.sum(rectangle[row_slice, col_idx + col_offset]):
continue
magic_square = rectangle[row_slice, col_slice]
if (MAGIC_SUM != magic_square.trace() or
MAGIC_SUM != magic_square[::-1].trace()):
continue
unique_number_mask = 0
for number in magic_square.flat:
unique_number_mask = unique_number_mask | (1 << (number - 1))
if unique_number_mask != MAGIC_NUMBER_MASK:
continue
magic_squares.add(magic_square)