如何制作列向量?
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) 形数组的差异(和共性)。 :)
我正在尝试将我的 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) 形数组的差异(和共性)。 :)