Хорошо, вот простой и не очень эффективный код, но для такого размера набора данных это хорошо.
import numpy as np
grid = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0.4,0.4,0.4,0,0,0],
[0,0,0,0,0.4,1.4,1.4,1.8,0.7,0,0,0,0,0],
[0,0,0,0,0.4,1.4,4,5.4,2.2,0.4,0,0,0,0],
[0,0,0.7,1.1,0.4,1.1,3.2,3.6,1.1,0,0,0,0,0],
[0,0.4,2.9,3.6,1.1,0.4,0.7,0.7,0.4,0.4,0,0,0,0],
[0,0.4,2.5,3.2,1.8,0.7,0.4,0.4,0.4,1.4,0.7,0,0,0],
[0,0,0.7,3.6,5.8,2.9,1.4,2.2,1.4,1.8,1.1,0,0,0],
[0,0,1.1,5,6.8,3.2,4,6.1,1.8,0.4,0.4,0,0,0],
[0,0,0.4,1.1,1.8,1.8,4.3,3.2,0.7,0,0,0,0,0],
[0,0,0,0,0,0.4,0.7,0.4,0,0,0,0,0,0]])
arr = []
for i in xrange(grid.shape[0] - 1):
for j in xrange(grid.shape[1] - 1):
tot = grid[i][j] + grid[i+1][j] + grid[i][j+1] + grid[i+1][j+1]
arr.append([(i,j),tot])
best = []
arr.sort(key = lambda x: x[1])
for i in xrange(5):
best.append(arr.pop())
badpos = set([(best[-1][0][0]+x,best[-1][0][1]+y)
for x in [-1,0,1] for y in [-1,0,1] if x != 0 or y != 0])
for j in xrange(len(arr)-1,-1,-1):
if arr[j][0] in badpos:
arr.pop(j)
for item in best:
print grid[item[0][0]:item[0][0]+2,item[0][1]:item[0][1]+2]
Я в основном просто делаю массив с положением верхнего левого угла и суммой каждого квадрата 2х2 и сортирую его по сумме. Затем я вынимаю квадрат 2x2 с наибольшей суммой из состязаний, помещаю его в массив best
и удаляю все остальные квадраты 2x2, которые использовали любую часть этого только что удаленного квадрата 2x2.
Кажется, что он работает нормально, за исключением последней лапы (с самой маленькой суммой в правом нижнем углу на вашем первом снимке), получается, что есть два других приемлемых квадрата 2x2 с большей суммой (и у них есть равные суммы друг другу). Один из них по-прежнему выбирает один квадрат из вашего квадрата 2x2, а другой - слева. К счастью, по счастливой случайности мы выбираем больше того, что вам хотелось бы, но это может потребовать использования некоторых других идей, чтобы получить то, что вы на самом деле хотите все время.