我最近遇到了幾個錯誤的因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,)一維數組的默認形狀?
我最近遇到了幾個錯誤的因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,)一維數組的默認形狀?
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]])
(4,1)數組的'羅嗦'顯示是不使其成爲'矢量'的默認值的一個很好的理由。 – hpaulj
我懷疑這個問題來了,因爲你有來自中,一切都被視爲一個矩陣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]
從文檔引用:
形狀:整數
形狀元組的元素的元組得到 相應陣列的尺寸的長度。
所以,當你的形狀像(4,)
這意味着它的第一個維度有4個元素。從你的例子來看它是正確的嗎?相反,如果我們的形狀如您所說的那樣爲(4, 1)
,那麼這意味着第一維(NumPy語言中的軸= 1)具有4個元素和第二維(在NumPy語言中,軸= 0 )中有1個元素,但並非如此(對於1D陣列)
1D數組應該是一維的,但是'(x,1)'或'(1,x)'是二維數組。它們有兩個維度,其中一個維度設置爲1.您能更具體地瞭解遇到的錯誤類型嗎?我懷疑這些錯誤可能實際上是功能:) – kazemakase
更好地解決它的問題。 – Goyo