Как вращать временные ряды в 5-й матричной матрице? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь повернуть некоторые сейсмические данные, хранящиеся в массиве nnd. Этот массив имеет размеры (N-приемник, M-источники, 3-source_channels, 3-приемные каналы, K-временные каналы).

Я знаю, как настроить вращение, если применять его к одной отметке времени (t_i) через один приемник и одну исходную станцию. Фактические обозначения Z, R, T, N, E, не важны для общей проблемы, просто знайте, что преобразование определено так:

image

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

Итак, мой вопрос состоит из двух частей:

  1. Как мне применить этот матричный продукт с numpy по всем временным шагам?

например: (3 x 3) * (3 x 3 x K ) * (3 x 3)

Как мне сделать этот матричный продукт с numpy, когда может быть произвольное число других измерений?

ex: (3 x 3) * ( N x М х 3 х 3 х К ) * (3 х 3)

1 Ответ

0 голосов
/ 12 ноября 2019

1)
(3 x 3) * (3 x 3 * K) * (3 * 3) = (3 x 3 x K)

np.einsum('ab,bcK,cd->adK', Arr1, Arr2, Arr3)

2)
(3 х 3) * (Н х М х 3 х 3 х К) * (3 х 3) = (Н х М х 3 х 3 х К)

np.einsum('ab,NMbcK,cd->NMadK', Arr1, Arr2, Arr3)
...