Я пытаюсь повернуть некоторые сейсмические данные, хранящиеся в массиве nnd. Этот массив имеет размеры (N-приемник, M-источники, 3-source_channels, 3-приемные каналы, K-временные каналы).
Я знаю, как настроить вращение, если применять его к одной отметке времени (t_i) через один приемник и одну исходную станцию. Фактические обозначения Z, R, T, N, E, не важны для общей проблемы, просто знайте, что преобразование определено так:
![\begin{vmatrix} ZZ(t_i) & ZR(t_i)& ZT(t_i) \\ RZ(t_i) & RR(t_i) & RT(t_i) \\ TZ(t_i) & TR(t_i)) & TT(t_i) \end{vmatrix} =\begin{vmatrix} 1 & 0 & 0 \\ 0 & cos(\alpha) & sin(\alpha) \\ 0 & -sin(\alpha) & cos(\alpha) \end{vmatrix} \begin{vmatrix} ZZ(t_i) & ZN(t_i) & ZE(t_i) \\ NZ(t_i) & NN(t_i) & NE(t_i) \\ EZ(t_i) & EN(t_i) & EE(t_i) \end{vmatrix} \begin{vmatrix} 1 & 0 & 0 \\ 0 & -cos(\beta) & -sin(\beta) \\ 0 & sin(\beta) & -cos(\beta) \end{vmatrix} image](https://latex.codecogs.com/gif.latex?%5Cbegin%7Bvmatrix%7D&space;ZZ(t_i)&space;&&space;ZR(t_i)&&space;ZT(t_i)&space;%5C%5C&space;RZ(t_i)&space;&&space;RR(t_i)&space;&&space;RT(t_i)&space;%5C%5C&space;TZ(t_i)&space;&&space;TR(t_i))&space;&&space;TT(t_i)&space;%5Cend%7Bvmatrix%7D&space;=%5Cbegin%7Bvmatrix%7D&space;1&space;&&space;0&space;&&space;0&space;%5C%5C&space;0&space;&&space;cos(%5Calpha)&space;&&space;sin(%5Calpha)&space;%5C%5C&space;0&space;&&space;-sin(%5Calpha)&space;&&space;cos(%5Calpha)&space;%5Cend%7Bvmatrix%7D&space;%5Cbegin%7Bvmatrix%7D&space;ZZ(t_i)&space;&&space;ZN(t_i)&space;&&space;ZE(t_i)&space;%5C%5C&space;NZ(t_i)&space;&&space;NN(t_i)&space;&&space;NE(t_i)&space;%5C%5C&space;EZ(t_i)&space;&&space;EN(t_i)&space;&&space;EE(t_i)&space;%5Cend%7Bvmatrix%7D&space;%5Cbegin%7Bvmatrix%7D&space;1&space;&&space;0&space;&&space;0&space;%5C%5C&space;0&space;&&space;-cos(%5Cbeta)&space;&&space;-sin(%5Cbeta)&space;%5C%5C&space;0&space;&&space;sin(%5Cbeta)&space;&&space;-cos(%5Cbeta)&space;%5Cend%7Bvmatrix%7D)
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)