Это способ быстрее:
(sum(map(sum, a)) - sum(map(sum, b))) * len(a) * len(b)
Поскольку вы расчета суммы общей разности массивов. Он будет работать в O (n), но ответ Кевина, использующий itertools, находится в O (n^2).
я не доказал это (редактировать: here's a proof outline), протестирован только с помощью двух случайных 100x100 массивов, но это отчасти интуитивно, если вы об этом думаете.
Код, как указано Кевином, предположил, что ваши массивы 100x100 и будут включать в себя 0. Я предположил, что вы просто хотели использовать два массива 100x100 и получили обозначение, немного испорченное - если вы действительно хотите пропустить 0 и не знаете размер массива, то вы можете использовать следующий фрагмент кода вместо:
from itertools import product
C = 100
def _sum(arr, a, b):
return sum(arr[i][j] for i, j in itertools.product(range(a, b), repeat=2))
answer = (_sum(a, 1, C) - _sum(b, 1, C)) * (C-1)**2
не так красиво, так как мы итерация подматрицы, но все-таки быстро. Если вы хотите использовать numpy, нарезанная версия может быть написана немного более сжато:
import numpy as np
A = np.array(a, np.int32)
B = np.array(b, np.int32)
answer = (np.sum(A[1:100, 1:100]) - np.sum(B[1:100, 1:100])) * 99**2
Вы пробовали 'itertools.permutations'? – Kevin
Вы написали, что хотите найти «все a [i] [j] - b [k] [l], где 0
Если я правильно понимаю результат, то '100 * 100 * (сумма (sa) для sa в a) - сумма (сумма (sb) для sb в b))'. Каждый элемент подсчитывается 10000 раз, а от «a» с положительным знаком, из «b» с отрицательным. – zch