2015-08-27 63 views
2

我最近從Matlab/Octave切換到SciPy/NumPy,我喜歡它。但是我發現有時候我會因爲細微的差異而感到困惑。在NumPy中,np.array([1,2,3,4,5])與np.array([[1],[2],[3],[4],[5]])不同嗎?

在Matlab中,當我們聲明尺寸5的「行向量」,那麼我們使用下面的命令:

x = [1, 2, 3 ,4, 5] % in matlab 
如下所示

該矢量的大小可以使用「size」命令來檢查:

size(x) 

ans = 

    1  5 

我曾以爲,在與NumPy下面是做同樣的事情如上。

x = np.array([1, 2, 3, 4, 5]) # in NumPy 

但是大小有點奇怪。

>>> np.shape(x) 
(5,) 

大小並不(5, 1),但它是(5,)。這究竟意味着什麼?我不太清楚爲什麼這個元組的第二個元素是空的。

我檢查下列返回(5,1)

y = np.array([[1], [2], [3], [4], [5]]) 
np.shape(y) 
(5, 1) 

然後,是 「Y」 中的相同NumPy的 「X」?我認爲它不是。我可能會誤解某些東西,但是有沒有人可以在這個話題上給我啓發?

謝謝!

+3

在MATLAB中的矩陣具有至少2個尺寸(年前它有完全相同2)。在numpy中,一個數組可以有任何數字 - 0,1,2等。另一個重要的區別 - MATLAB'pads'數組尺寸在最後,因此是'(5,1)'形狀。 numpy在開始時添加它們 - 如果需要的話。 – hpaulj

+0

感謝您的評論!但我認爲MATLAB在結尾「填充」數組維度並不是真的。正如你所提到的,在Matlab中,一個矩陣具有二維,並且一個向量被假定爲一個特殊類型的維數爲N×1或1×N的矩陣。所以一個行向量的大小變爲[1,N ]。如果它是列向量,則大小變爲[N,1]。 – chanwcom

+0

如果我要求「第10」維度,那麼告訴我'1':'size(1:10,10)'沒有問題。 – hpaulj

回答

7

NumPy數組的形狀始終是一個元組。 (5)不是元組,因爲Python評估它等於數字5.要獲得元組,必須在5之後添加逗號,如(5,)。 因此,(5,)是含有1個值,數字5和 (5, 1)一個元組由含有2個值中,數字5和1

在所述元組的元素的數目等於所述陣列的維數的元組。在NumPy術語中,尺寸也稱爲「軸」。 所以

x = np.array([1, 2, 3, 4, 5]) 

是形狀(5,)的陣列,它具有1個維。

相反,

y = np.array([[1], [2], [3], [4], [5]]) 

是形狀(5, 1)的陣列,並且有2種尺寸。 因此,xy是不一樣的。在NumPy的行話


注意,「大小」或陣列是指值的數組中的編號:

In [48]: x.size 
Out[48]: 5 

In [49]: y.size 
Out[49]: 5 

NumPy的陣列可以"broadcast"它們的值要像陣列更高的維度。由於廣播可以將新軸添加到陣列形狀的左側,形狀(5,)的陣列可以廣播以形成(1, 5)

因爲對於二維數組,第一個軸可以被認爲是對應於行和第二個軸的列,像x這樣的1維數組可以表現得像1行5列數組 - 即一個行向量。 y的形狀爲(5, 1),這使其成爲5行1列陣列 - 即列向量。

如果用形狀(5, 1)(即列矢量)的陣列添加形狀(1, 5)(即行矢量)的陣列,所述廣播規則產生形狀(5, 5)的數組:

In [60]: x + y 
Out[60]: 
array([[ 2, 3, 4, 5, 6], 
     [ 3, 4, 5, 6, 7], 
     [ 4, 5, 6, 7, 8], 
     [ 5, 6, 7, 8, 9], 
     [ 6, 7, 8, 9, 10]]) 

如果想要x表現爲列向量,您需要在右側上添加新軸。廣播從來沒有這樣做,所以你必須手動使用x[:, np.newaxis]。 增加兩個列向量產生另一列向量:

In [61]: x[:, np.newaxis].shape 
Out[61]: (5, 1) 

In [56]: x[:, np.newaxis] + y 
Out[56]: 
array([[ 2], 
     [ 4], 
     [ 6], 
     [ 8], 
     [10]]) 
相關問題