【发布时间】:2019-11-01 19:27:39
【问题描述】:
我正在尝试旋转保存在 numpy nd-array 中的一些地震数据。这个数组有维度(N-receiver, M-sources,3-source_channels, 3-receiver channels, K-time channels)。
如果应用于单个接收器和单个源站的单个时间戳 (t_i),我知道如何设置轮换。实际的 Z、R、T、N、E 符号对于一般问题并不重要,只要知道转换是这样定义的:
在 python 中,对于单个时间戳,我可能会编写如下代码:
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 进行此矩阵乘积?
例如:(3 x 3) * (N x M x 3 x 3 x K) * (3 x 3)
【问题讨论】:
-
@的基本原理是它在最后 2 个维度上执行dot,矩阵乘法,并将所有较早的维度视为“批处理”维度,遵守正常的 numpy 广播规则。跨度>
标签: python-3.x numpy numpy-ndarray numpy-einsum