2016-09-20 36 views
3

這似乎是一個非常基本的問題,但我沒有在堆棧中找到與它相關的任何內容。如果我錯過了一個現有的問題,我抱歉。在numpy中是否有任何性能原因使用ndim 1或2向量?

我已經看到了一些數學/線性代數原因,爲什麼人們可能想要使用numpy向量「適當」(即ndim 1),而不是行/列向量(即ndim 2)。

但現在我想知道:有沒有任何(顯着的)效率爲什麼可以選擇一個比其他人更好的原因?或者在這方面選擇是非常武斷的?

(編輯)澄清:所謂 「NDIM 1對NDIM 2個載體」 我的意思是表示包含,比方說一個矢量,數字3和4任一:

  • np.array([3, 4])#1 NDIM

  • np.array([[3,4]])#2 NDIM

的numpy的文件似乎朝着第一殼體作爲默認傾斜,但像我說,我想知道是否有任何表現區別。

+0

與MATLAB或GNU八度對比,有時會在添加連接2-D矩陣和1-D矢量時有點混淆。除非將1-D矢量轉換爲2-D矩陣,否則失敗,但在MATLAB中沒有任何困難。 (在MATLAB中,所有矢量都是1xN或Nx1大小的二維矩陣) – Jeon

回答

2

如果您正確使用numpy,那麼無 - 這不是一個考慮因素。

如果看看numpy internals documentation,你可以看到,

numpy的陣列由兩個主要組件組成,原始陣列數據(從現在起稱爲數據緩衝器),以及有關信息原始數組數據。數據緩衝區通常被人們認爲是C或Fortran中的數組,這是一個包含固定大小數據項的連續(固定)內存塊。 Numpy還包含一組重要的數據,描述如何解釋數據緩衝區中的數據。

因此,不管陣列的大小如何,所有數據都存儲在一個連續的緩衝區中。現在考慮

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

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

這是事實,訪問a[1]要求(略)比b[1, 1]操作較少(截至1, 1到扁平索引翻譯需要一些計算),但是,對於高性能,無論如何都需要vectorized operations

如果你想對數組中的所有元素進行求和,那麼在這兩種情況下,你都會使用相同的東西:a.sum()b.sum(),並且總和將在連續內存中的元素之上。相反,如果數據固有地是2d,那麼你可以做一些事情,比如b.sum(axis=1)來總結行。在1d陣列中自己做這件事很容易出錯,而且效率也不高。

所以,基本上是一個二維數組,如果問題很自然,它只會提供更多的功能,其開銷爲零或可以忽略不計。

+0

謝謝,很好的答案。不知道我理解你的最後一行:「所以,你基本上有更多的功能」。 「更大的功能」並不是指2D上的1d(反之亦然),而是選擇任何一種表示的選項。我就是這麼理解的,我是否明白了? –

+0

@BertZangle感謝您的評論。更新。如果需要,請隨時進一步評論。 –

+0

只是自己運行一些簡單的時間測試(在大型矩陣和dim 1/dim 2矢量上的np.dot)。當然,這不是一個徹底的測試,而只是一種讓自己相信你上面寫的東西的方法。標記爲已回答。再次感謝! –

相關問題