You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NumPy中从一维时间序列构建三维矩阵?

问题描述

假设我有四个(N,)向量A、B、C和D:

import numpy as np

N = 100

A = 1*np.ones(N)   # => array([1,1,1,...])
B = 2*np.ones(N)   # => array([2,2,2,...])
C = 3*np.ones(N)   # => array([3,3,3,...])
D = 4*np.ones(N)   # => array([4,4,4,...])

实际应用中这些向量是随时间变化的矩阵元素(示例中为常量)。我需要构建形状为(N,2,2)的矩阵,让每个时间步对应一个2x2矩阵[[a,b],[c,d]]并沿axis 0扩展。现有解决方案可读性较差,想找更简洁的实现方式。

现有解决方案:

A_ = np.reshape(A, (N,1,1))
B_ = np.reshape(B, (N,1,1))
C_ = np.reshape(C, (N,1,1))
D_ = np.reshape(D, (N,1,1))

AB = np.concatenate((A_, B_),axis=2)
CD = np.concatenate((C_, D_),axis=2)

ABCD = np.concatenate((AB,CD),axis=1)

运行结果符合预期:

>>> ABCD
array([[[1., 2.],
        [3., 4.]],

       [[1., 2.],
        [3., 4.]],

       [[1., 2.],
        [3., 4.]],
...
...
       [[1., 2.],
        [3., 4.]],

       [[1., 2.],
        [3., 4.]]])
更简洁的实现方法

方法1:堆叠后直接调整形状

一步完成向量堆叠与形状转换,代码极简:

ABCD = np.stack([A, B, C, D], axis=1).reshape(N, 2, 2)

解释:np.stack将四个(N,)向量组合为(N,4)数组,再通过reshape把最后一维拆分为(2,2),刚好匹配目标结构。

方法2:按行构造后堆叠

先构造每个2x2矩阵的两行,再沿指定轴堆叠,可读性强:

# 构造每行的(N,2)数组
row1 = np.column_stack([A, B])
row2 = np.column_stack([C, D])
# 沿axis=1堆叠得到(N,2,2)
ABCD = np.stack([row1, row2], axis=1)

方法3:直接赋值(最直观)

创建目标形状数组后,逐个位置赋值,逻辑一目了然:

ABCD = np.zeros((N, 2, 2))
ABCD[:, 0, 0] = A
ABCD[:, 0, 1] = B
ABCD[:, 1, 0] = C
ABCD[:, 1, 1] = D

方法4:利用块矩阵构造工具

如果后续需要扩展为更复杂的块矩阵,np.block是更通用的选择:

ABCD = np.block([[A[:, None], B[:, None]], 
                 [C[:, None], D[:, None]]])

解释:[:, None]将(N,)向量转为(N,1)维度,让np.block可以组合出(N,2,2)的目标数组。

内容的提问来源于stack exchange,提问作者Sam Gallagher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:50:27