(五)重排形状、交换轴与组合数据
1. reshape 与转置保留的内容
把 [1,2,3,4,5,6] 每两个分一组,就得到三行两列。reshape 保留既定读取次序,重新分组索引;转置则交换轴的角色:
# 项目文件:demos/reshape_stack.py
# reshape 改变索引分组,转置交换轴;拼接沿已有轴,stack 新建一个轴。
import numpy as np
flat = np.arange(1, 7)
a = flat.reshape(3, 2)
print("重排", a.tolist(), a.shape)
print("转置", a.T.tolist(), a.T.shape)
v = np.array([1, 2, 3])
print("向量转置", v.T.shape, "行列", v[None, :].shape, v[:, None].shape)
print("自动长度", flat.reshape(2, -1).shape)
print("接行", np.concatenate((a, a), axis=0).shape)
print("新轴", np.stack((a, a), axis=0).shape)
print("组合列", np.column_stack((v, v * 10)).tolist())reshape 后为 [[1,2],[3,4],[5,6]];转置后为 [[1,3,5],[2,4,6]]。shape 从 (3,2) 变成 (2,3),原来的列成为行。reshape(2,-1) 中的 −1 让 NumPy 根据总数推算该轴长度,所以得到 (2,3)。
一维 v 的 .T 仍是 (3,)。用 v[None,:] 插入行轴得到 (1,3),用 v[:,None] 插入列轴得到 (3,1)。None 在索引里增加一个长度为 1 的轴,与取出某个元素的整数索引作用不同。
2. 拼接已有轴与建立新轴
concatenate((a,a),axis=0) 沿天这一轴接到后面,结果为 (6,2)。stack((a,a),axis=0) 新增一层,结果为 (2,3,2);可以把新增轴解释为两位读者。column_stack((v,v*10)) 把两个一维数组组成两列,得到 [[1,10],[2,20],[3,30]]。
这些操作表达不同的数据组织方式。新增一批记录用拼接,保存两份同样布局的观测用 stack;后面选择 axis 时继续沿用这里给出的含义。