У меня есть массив изображений размером 512x512, и я хочу выполнять операции с блоками 8x8. На данный момент у меня есть что-то вроде этого:
output = np.zeros(512, 512)
for i in range(0, 512, 8):
for j in rangerange(0, 512, 8):
a = input[i:i+8, j:j+8]
b = some_other_array[i:i+8, j:j+8]
output[i:i+8, j:j+8] = np.dot(a, b)
, где a
& b
- блоки 8x8, полученные из исходного массива. Я хотел бы ускорить этот код, используя векторизованные операции. Я изменил свои входные данные следующим образом:
input = input.reshape(64, 8, 64, 8)
some_other_array = some_other_array.reshape(64, 8, 64, 8)
Как я могу выполнить скалярное произведение только на осях 1
& 3
, чтобы вывести массив формы (64, 8, 64, 8)
?
Я пробовал np.tensordot(input, some_other_array, axes=([0, 1], [2, 3]))
, который дает правильную форму вывода, но значения не соответствуют выводу из l oop выше. Я также смотрел np.einsum
, но я не встречал простого примера того, чего я пытаюсь достичь.