Я пытаюсь повернуть некоторые сейсмические данные, хранящиеся в массиве nnd. Этот массив имеет размеры (N-приемник, M-источники, 3-source_channels, 3-приемные каналы, K-временные каналы).
Я знаю, как настроить вращение, если применять его к одной отметке времени (t_i) через один приемник и одну исходную станцию. Фактические обозначения Z, R, T, N, E, не важны для общей проблемы, просто знайте, что преобразование определено так:
In python, for a single timestamp I'd probably code up something like:
import numpy as np
a = 50.0 # example alpha
b = 130 # example beta
a_rotation = np.asarray([[1,0,0],[0,np.cos(a),np.sin(a)],[0,-np.sin(a),np.cos(a)]])
b_rotation = np.asarray([[1,0,0],[0,-np.cos(b),-np.sin(b)],[0,np.sin(b),-np.cos(b)]])
# pretend the zn's are actual float data
single_timeslice_data = np.asarray([[zz,zn,ze],[nz,nn,ne],[ez,en,ee]])
# operation w numpy matrix rotation
rotated_channels = a_rotation @ single_timeslice_data @ b_rotation
Итак, мой вопрос состоит из двух частей:
- Как мне применить этот матричный продукт с numpy по всем временным шагам?
например: (3 x 3) * (3 x 3 x K ) * (3 x 3)
Как мне сделать этот матричный продукт с numpy, когда может быть произвольное число других измерений?
ex: (3 x 3) * ( N x М х 3 х 3 х К ) * (3 х 3)