сворачивать многомерный куб с двумерным массивом - PullRequest
3 голосов
/ 16 мая 2019

Я свернул трехмерный куб данных формы [nLambda, nX, nY] с фильтром формы [nLambda, 3].Мне удалось заставить это работать в этой ситуации, но мне нужно повторить этот процесс на большом количестве кубов, которые сохраняются как [nt, nLambda, nX, nY].Я хочу расширить код, чтобы справиться с этим, но я продолжаю портить тайлы.Кто-нибудь знает, как это сделать?

Моя текущая программа делает:

datacube.shape         = [21,100,100]
filters.shape          = [21,3]
data_collapsed.shape   = [100,100,3]   

Я хочу это сделать

datacube.shape         = [10,21,100,100]
filters.shape          = [21,3]
data_collapsed.shape   = [10,100,100,3]     

Код, который я использую для 3D-кубов

nl,nx,ny = datacube.shape
filter_rgb = np.tile(filters, (ny,nx,1,1))
filter_rgb = np.swapaxes(filter_rgb, 0,2)
data_rgb = np.tile(datacube,(3,1,1,1))
data_rgb = np.swapaxes(data_rgb,0,-1)
data_filtered = data_rgb * filter_rgb
data_collapsed = np.sum(data_filtered, axis=0)

1 Ответ

1 голос
/ 16 мая 2019

Вы можете использовать np.tensordot.

Для datacube в качестве 4D кейса -

data_collapsed = np.tensordot(datacube,filters,axes=(1,0))

Для 3D кейса -

data_collapsed = np.tensordot(datacube,filters,axes=(0,0))

Связанный пост, чтобы понять tensordot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...