【问题标题】:How to combine column vectors into a matrix如何将列向量组合成矩阵
【发布时间】:2020-06-15 01:11:01
【问题描述】:

如何将多个列向量组合成一个矩阵?例如,如果我有 3 个 10 x 1 向量,如何将它们放入 10 x 3 矩阵? 到目前为止,这是我尝试过的:

D0 =np.array([[np.cos(2*np.pi*f*time)],[np.sin(2*np.pi*f*time)],np.ones((len(time),1)).transpose()],'float').transpose()

这给了我这样的东西,

[[[ 1.00000000e+00  0.00000000e+00  1.00000000e+00]]

 [[ 9.99999741e-01  7.19053432e-04  1.00000000e+00]]

 [[ 9.99998966e-01  1.43810649e-03  1.00000000e+00]]

 ...

 [[ 9.99998966e-01 -1.43810649e-03  1.00000000e+00]]

 [[ 9.99999741e-01 -7.19053432e-04  1.00000000e+00]]

 [[ 1.00000000e+00 -2.15587355e-14  1.00000000e+00]]]

但是,我认为这是不对的,它看起来更像是一个列表数组(而且我不能用这种形式进行矩阵乘法)......我也试过 numpy.concatenate,但那没有也不适合我......接下来查看堆栈......

在 Matlab 符号中,我需要把它变成一个表格

D0 =[cos(2*pi*f *t1), sin(2*pi*f*t1) ,1; cos(2*pi*f*t2), sin(2*pi*f*t2) ,1;....] etc

这样我就可以找到最小二乘解s_hat:

s_hat = (D0^T D0)^-1(D0^T x)

其中 x 是另一个输入向量,其中包含我要拟合的正弦曲线样本。

在 Matlab 中,我可以输入

D0 = [cos(2*np.pi*f*time),sin(2*np.pi*f*time), repmat(1,len(time),1)]

创建 D0 矩阵。我如何在 python 中做到这一点?

谢谢!

【问题讨论】:

标签: python arrays numpy matrix vector


【解决方案1】:

这里有 Matlab 和 Python/NumPy 中等效的完整示例:

% Matlab
f = 0.1;
time = [0; 1; 2; 3];
D0 = [cos(2*pi*f*time), sin(2*pi*f*time), repmat(1,length(time),1)]
# Python
import numpy as np
f = 0.1
time = np.array([0, 1, 2, 3])
D0 = np.array([np.cos(2*np.pi*f*time), np.sin(2*np.pi*f*time), np.ones(time.size)]).T
print(D0)

请注意,与 Matlab 不同,Python/NumPy 没有特殊的语法来区分行和列(, 与 ; 在 Matlab 中)。类似地,一维 NumPy 数组没有“列”或“行”向量的概念。如上所述,当将多个 1D NumPy 数组合并为单个 2D 数组时,每个 1D 数组最终都作为 2D 数组中的一行。由于您希望它们作为列,因此您需要转置二维数组,这里只需通过 .T 属性即可完成。

【讨论】:

  • 感谢您的示例和解释。帮了大忙!
  • 但是,我仍然不能对 D0 进行转置并将其乘以 D0,即 D0.T * D0 给我一个错误,上面写着“ VALueError: operands could not be broadcast together with形状 (3,262145) (262145,3)..
  • * 不是 Python/NumPy 中的矩阵乘法,而是元素乘法(Matlab 中的.*)。如果您有 Python 3.5 或更高版本,则可以使用 @ 运算符:D0.T @ D0。如果没有,请使用np.dot(D0.T, D0)。
【解决方案2】:

如果数组真的是 (10,1) 形状,那么只需连接:

In [60]: x,y,z = np.ones((10,1),int), np.zeros((10,1),int), np.arange(10)[:,None]              
In [61]: np.concatenate([x,y,z], axis=1)                                                       
Out[61]: 
array([[1, 0, 0],
       [1, 0, 1],
       [1, 0, 2],
       [1, 0, 3],
       [1, 0, 4],
       [1, 0, 5],
       [1, 0, 6],
       [1, 0, 7],
       [1, 0, 8],
       [1, 0, 9]])

如果它们实际上是一维的,您将不得不以一种或另一种方式摆弄尺寸。例如,像上面的z 那样重塑或添加尺寸。或者使用一些功能来为你做到这一点:

In [62]: x,y,z = np.ones((10,),int), np.zeros((10,),int), np.arange(10)                        
In [63]: z.shape                                                                               
Out[63]: (10,)
In [64]: np.array([x,y,z]).shape                                                               
Out[64]: (3, 10)
In [65]: np.array([x,y,z]).T       # transpose                                                            
Out[65]: 
array([[1, 0, 0],
       [1, 0, 1],
       [1, 0, 2],
       [1, 0, 3],
       [1, 0, 4],
       [1, 0, 5],
       [1, 0, 6],
       [1, 0, 7],
       [1, 0, 8],
       [1, 0, 9]])

np.array([...]) 在新的初始维度上连接数组。请记住,在 Python/numpy 中,第一个维度是最外层的(MATLAB 是相反的)。

stack 变体调整尺寸,然后执行concatenate:

In [66]: np.stack([x,y,z],axis=1).shape                                                        
Out[66]: (10, 3)
In [67]: np.column_stack([x,y,z]).shape                                                        
Out[67]: (10, 3)
In [68]: np.vstack([x,y,z]).shape                                                              
Out[68]: (3, 10)

===

D0 =np.array([[np.cos(2*np.pi*f*time)],[np.sin(2*np.pi*f*time)],np.ones((len(time),1)).transpose()],'float').transpose()

我猜f 是标量,time 是一维数组(形状 (10,))

[np.cos(2*np.pi*f*time)]

在[] 中包裹一个 (10,),当它变成一个数组时变成 (1,10) 形状。

np.ones((len(time),1)).transpose() 被 (10,1) 转换为 (1,10)。

np.array(....) 其中创建了一个 (3,1,10) 数组。转置为 (10,1,3)。

如果您删除了创建 (1,10) 数组的 [] 和形状:

D0 =np.array([np.cos(2*np.pi*f*time), np.sin(2*np.pi*f*time), np.ones((len(time))]).transpose()

将连接 3 个 (10,) 数组以生成 (3,10),然后转置为 (10,3)。

或者,

D0 =np.concatenate([[np.cos(2*np.pi*f*time)], [np.sin(2*np.pi*f*time)], np.ones((1,len(time),1))], axis=0)

将 3 个 (1,10) 数组连接成一个 (3,10),您可以对其进行转置。

【讨论】:

  • 这一切都非常有启发性。感谢您抽出宝贵时间。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-03
  • 2013-09-04
  • 2013-01-28
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多