[英]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.