簡體   English   中英

如何將列向量組合成矩陣

[英]How to combine column vectors into a matrix

如何將多個列向量組合成一個矩陣? 例如,如果我有 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 中做到這一點?

謝謝!

這里有 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 數組沒有“列”或“行”向量的概念。 如上所述,當將多個一維 NumPy 數組合並為一個二維數組時,每個一維數組最終會成為二維數組中的一行。 當您希望它們作為列時,您需要轉置 2D 數組,這里僅通過.T屬性完成。

如果數組確實是 (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]])

如果它們實際上是 1d,您將不得不以一種或其他方式擺弄尺寸。 例如,就像我在上面對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),您可以對其進行轉置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM