【问题标题】:How do I rotate timeseries in a 5-d numpy matrix?如何在 5-d numpy 矩阵中旋转时间序列?
【发布时间】: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

所以我的问题是双重的:

  1. 如何在所有时间步上应用这个带有 numpy 的矩阵乘积?

例如:(3 x 3) * (3 x 3 x K) * (3 x 3)

  1. 当可能存在任意数量的其他维度时,如何使用 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


【解决方案1】:

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 x 3) * (N x M x 3 x 3 x K) * (3 x 3) = (N x M x 3 x 3 x K)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2014-07-17
    • 2017-03-07
    • 1970-01-01
    • 2019-09-27
    • 2012-08-22
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多