如何在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
相关产品推荐
相关产品推荐

