如何用Python高效转换栅格堆栈为像素时间序列?
用Numpy快速实现栅格转像素时间序列(无需循环)
问题说明
你有一个由多时间层栅格组成的数组,需要将同一位置像素的各时间值提取为子数组,形成时间序列数组,完全不需要用循环实现。
测试数据翻译与说明
测试数据生成代码:
import numpy as np data = np.random.random((3, 4, 4)) stack = np.dstack(data) # 只是把形状改成(4,4,3),将图像时间层放在最后一维
解决方案
Numpy的维度变换操作是底层优化的,效率远高于手动循环,下面分两种场景给出代码:
场景1:对应你给出的示例数组A(形状(3, 1, 8))
# 示例数组A A = np.array([[[0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]], [[1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]], [[1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5]]]) # 调整轴顺序,再展平空间维度 transposed = A.transpose(1, 2, 0) # 将时间轴移到最后,形状变为(1,8,3) B = transposed.reshape(-1, 3) # 展平前两维,得到目标形状(8,3)
场景2:对应测试数据的stack数组(形状(4,4,3))
这种情况更简单,直接展平空间维度即可:
# 直接将(4,4,3)展平为(16,3),每个子数组对应一个像素的时间序列 B = stack.reshape(-1, 3)
核心逻辑
- 明确数组各轴的含义:比如原数组的轴是
(时间层, 行数, 列数),stack的轴是(行数, 列数, 时间层) - 用
transpose()调整轴的顺序,把时间轴放到合适的位置 - 用
reshape(-1, N)自动展平所有空间维度,其中N是时间层的数量
内容的提问来源于stack exchange,提问作者kolrocket
相关产品推荐
相关产品推荐

