Numpy вычесть два массива одинаковой ndim, но разной формы

1

Итак, у меня есть два 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) массивами форм.

Как я могу сделать это в векторизации без петель? Этот поток делает что-то похожее, но в меньших размерах, и я не могу понять, как его расширить.

Теги:
arrays
numpy

1 ответ

2
Лучший ответ
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) 

Упорядочение новых осей диктует изменение формы, поэтому будьте осторожны с этим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню