Я бы использовал numpy, чтобы помочь с этим.
Для начала я бы преобразовал массивы в numpy массивы
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]])
, затем я бы инициализировал массив для хранения результатов теста.(необязательно: также словарь)
result_shape = np.array(big.shape) - np.array(small.shape) + 1
results = np.zeros((result_shape[0], result_shape[1]))
result_dict = {}
Затем выполните итерации по позициям, в которых небольшая матрица может быть расположена над большой матрицей, и рассчитайте разницу:
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])
Затем выможно print(results)
и получить:
[[ 28. 29. 38.]
[ 24. 31. 39.]]
и / или поскольку позиция маленькой матрицы над большой матрицей хранится в ключах словаря, вы можете получить положение маленькой матрицы надбольшая матрица, где наименьшая разница при манипуляциях с ключами:
pos_min = [int(i) for i in list(min(result_dict, key=result_dict.get))]
, а если вы print(pos_min)
, вы получите:
[1, 0]
, тогда если вам нужен индекс для всего, что вы можете повторитьнад ним, если требуется.Надеюсь, это поможет!