Итак, у меня есть два ndarrays:
A с формой (N, a, a), набор из N массивов формы (a, a) в основном
B с формой (8, M, a, a), матрица из 8 х M массивов формы (a, a)
Мне нужно вычесть B из A (AB) так, чтобы полученный массив имел форму (8, M * N, a, a). Более подробно каждый (M всего) из 8 массивов B необходимо вычитать из каждого массива в A, что приводит к 8 * M * N вычитаниям между (a, a) массивами форм.
Как я могу сделать это в векторизации без петель? Этот поток делает что-то похожее, но в меньших размерах, и я не могу понять, как его расширить.
A = np.arange(8).reshape(2,2,2)
B = np.ones(shape=(8,4,2,2))
Общее вещание работает, если измерения одинаковы или если одно измерение равно 1, поэтому мы делаем это;
a = A[np.newaxis, :, np.newaxis, :, :]
b = B[:, np.newaxis, :, :, :]
a.shape # <- (1,2,1,2,2)
b.shape # <- (8,1,4,2,2)
Теперь, когда вы можете сделать трансляцию
c = a - b
c.shape # <- (8,2,4,2,2)
И когда вы изменяете форму (2x4 = 8) компоненты выровнены.
c.reshape(8,-1,2,2)
Упорядочение новых осей диктует изменение формы, поэтому будьте осторожны с этим.