2017-04-03 103 views
2

我最近遇到了幾個錯誤的因numpy的陣列的形狀是(X) - 這些都可以很容易地通過下面的代碼片段爲什麼使用形狀(x,)而不是(x,1)的數組?

a = np.array([1,2,3,4]) #this form produced a bug 
a.shape 
>>> (4,) 
a.shape = [4,1] #but this change fixed it 

是固定的,但它確實讓我懷疑,這是爲什麼( x,)一維數組的默認形狀?

+7

1D數組應該是一維的,但是'(x,1)'或'(1,x)'是二維數組。它們有兩個維度,其中一個維度設置爲1.您能更具體地瞭解遇到的錯誤類型嗎?我懷疑這些錯誤可能實際上是功能:) – kazemakase

+0

更好地解決它的問題。 – Goyo

回答

2

shape的元組中的每個項表示一個軸。當你有一個項目時,意味着你的數組是1維(1軸),否則它將是一個二維數組。當你做a.shape = [4,1]你只是你的一維數組轉換爲二維:

In [26]: a = np.array([1,2,3,4]) 
In [27]: a.shape = [4,1] 

In [28]: a.shape   
Out[28]: (4, 1) 

In [29]: a 
Out[29]: 
array([[1], 
     [2], 
     [3], 
     [4]]) 
+0

(4,1)數組的'羅嗦'顯示是不使其成爲'矢量'的默認值的一個很好的理由。 – hpaulj

1

我懷疑這個問題來了,因爲你有來自中,一切都被視爲一個矩陣Matlab的背景。在Matlab中,所有1D數據集都被視爲行或列向量,並且索引被短路,以便指定單個索引將這兩個數據集視爲1D列表。

Numpy不處理矩陣本身,而是處理嵌套列表。列表列表對Matlab的矩陣有類似的解釋,但是有一些關鍵的區別。例如,如果您只給它一個索引,Numpy將不會對您指的是哪個元素做任何假設,索引始終行爲相同,而不管嵌套列表的深度如何。

import numpy as np 

arr = np.array([1, 2, 3, 4]) 
print(arr) 
>> [1 2 3 4] 
print(arr[0]) 
>> 1 

arr.shape = [4, 1] 
print(arr) 
>> [[1] 
>> [2] 
>> [3] 
>> [4]] 
print(arr[0]) 
>> [1] 

arr.shape = [1, 4] 
print(arr) 
>> [[1 2 3 4]] 
print(arr[0]) 
>> [1 2 3 4] 
0

從文檔引用:

形狀:整數
形狀元組的元素的元組得到 相應陣列的尺寸的長度。

所以,當你的形狀像(4,)這意味着它的第一個維度有4個元素。從你的例子來看它是正確的嗎?相反,如果我們的形狀如您所說的那樣爲(4, 1),那麼這意味着第一維(NumPy語言中的軸= 1)具有4個元素和第二維(在NumPy語言中,軸= 0 )中有1個元素,但並非如此(對於1D陣列)

相關問題