Python NumPy中如何正确构造列向量拼接的目标维度矩阵
MATLAB转NumPy列向量拼接矩阵问题修正
问题原因
- MATLAB中
x(:)会将任意维度的数组强制展开为列向量,空格分隔的数组表示水平按列拼接,因此G=[x(:).^0 x(:).^1]直接得到n行2列的矩阵。 - NumPy中通过
np.linspace(-10,10,2001)生成的x是形状为(2001,)的一维数组,对一维数组调用.T转置不会改变数组形状,无法得到列向量。 - 第一次尝试的写法
np.array([[x.T**0],[x.T**1]])额外嵌套了两层方括号,会凭空新增两个维度,最终得到4维数组,属于多余嵌套导致的维度错误。 - 第二次尝试的写法
np.array((np.ones(x.size).T, x.T))会将两个一维数组按行堆叠,得到形状为(2,2001)的数组,和目标的(2001,2)维度顺序相反。
正确实现方法
方法1:完全对齐MATLAB原逻辑
先将一维x转为二维列向量(对应MATLAB的x(:)操作),再做水平拼接:
import numpy as np x = np.linspace(-10, 10, 2001) # 将x转为n行1列的列向量,等价于MATLAB的x(:) x_col = x.reshape(-1, 1) G = np.hstack([x_col**0, x_col**1])
运行后查看G.shape可得到输出(2001, 2),第一列全为1,第二列为x的对应取值,和MATLAB运行结果完全一致。
方法2:更简洁的按列拼接写法
用NumPy自带的按列堆叠函数,不需要手动将x转为二维列向量,直接传入一维数组即可:
# column_stack专门用于将多个一维/二维数组按列拼接为二维矩阵 G = np.column_stack([np.ones_like(x), x])
这里用np.ones_like(x)替代x**0,不需要做幂运算,运行效率更高,也避免了0的0次方可能触发的计算警告,结果完全相同。
方法3:用列拼接简写符
NumPy的np.c_是按列拼接的简写形式,写法更简短:
G = np.c_[np.ones(x.size), x]
注意事项
NumPy中一维数组没有行列的概念,对一维数组做转置不会改变形状。如果需要得到列向量,必须显式调用reshape(-1,1)或者x[:, np.newaxis]将其转换为二维数组后再做拼接操作。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

