如何制作列向量?

How can I make a column vector?

我正在尝试将我的 MATLAB 代码转换为 Python。在 MATLAB 中我写道:

G=[x(:).^0 x(:).^1];

其中 x 大小为 (1,2001) 并由

创建
x=linspace(-10,10,2001)

G大小为(2001,2)第一列等于1,第二列的值为x.

当我尝试制作 G 矩阵时

G=np.array([[x.T**0],[x.T**1]])

它创建一个大小为 (2,1,1,2001) 的数组。

我试过了

G=np.array((np.ones(x.size).T, x.T))

但这不是我想要的方式。如何修复?

要制作 G 你需要使用 numpy.vstack:

import numpy as np

x1 = np.linspace(-10, 10, 2001)
x0 = x1**0

G = np.vstack((x0,x1)).T
print(G.shape)

(2001, 2)

虽然 MATLAB 中的一切都是 2d(或更大),并且尾部维度在最外层,但在 numpy 中,数组可以是 1d(甚至 0d),并且前导维度在最外层。

In [208]: x = np.linspace(-10,10,5)

In [209]: x
Out[209]: array([-10.,  -5.,   0.,   5.,  10.])     
In [210]: x.shape
Out[210]: (5,)

Transpose 对一维数组没有任何作用:

In [211]: x.T
Out[211]: array([-10.,  -5.,   0.,   5.,  10.])

np.array 是组合大小匹配数组的自然工具。这只是常见演示的扩展,np.array([[1,2],[3,4]]) 其中参数是 2 个列表的列表。

In [212]: np.array((x**0, x**1))
Out[212]: 
array([[  1.,   1.,   1.,   1.,   1.],
       [-10.,  -5.,   0.,   5.,  10.]])

我认为这样的数组 (2,n) 是 MATLAB (n,2) 矩阵的自然翻译。

但是这样的数组很容易转置:

In [213]: np.array((x**0, x**1)).T
Out[213]: 
array([[  1., -10.],
       [  1.,  -5.],
       [  1.,   0.],
       [  1.,   5.],
       [  1.,  10.]])

或者您可以将 stack 与轴一起使用:

In [214]: np.stack((x**0, x**1), axis=1)
Out[214]: 
array([[  1., -10.],
       [  1.,  -5.],
       [  1.,   0.],
       [  1.,   5.],
       [  1.,  10.]])

你可以制作一个二维数组,形状为 (5,1) :

In [216]: x1 = x[:,None]   # or x.reshape(-1,1)

In [217]: x1
Out[217]: 
array([[-10.],
       [ -5.],
       [  0.],
       [  5.],
       [ 10.]])

这更接近于 MATLAB 用户所说的列向量。

然后连接第二个轴上的那些:

In [218]: np.hstack((x1**0, x1**1))
Out[218]: 
array([[  1., -10.],
       [  1.,  -5.],
       [  1.,   0.],
       [  1.,   5.],
       [  1.,  10.]])

似乎任性的 MATLAB 用户通常很难适应 (n,)、(1,n) 和 (n,1) 形数组的差异(和共性)。 :)