2013-02-27 83 views
4

我構建了一個對未來數據進行迭代的類。數據以數組形式存在,而不使用numpy對象。在我的代碼中,我經常使用.append來創建另一個數組。在某些時候,我將其中一個大數組1000x2000更改爲numpy.array。現在我在出錯後出現錯誤。我開始將所有數組轉換爲ndarray,但像.append這樣的註釋不再適用。我開始有指向行,列或單元格的問題。並且必須重建所有代碼。什麼是使用ndarray而不是python數組的原因

我試着谷歌的問題的答案:「什麼是和使用普通陣列ndarray優勢」我找不到明智的答案。你可以寫什麼時候我應該開始使用ndarrays,如果你在實踐中使用它們或僅使用一個。

對不起,如果問題是一個新手級別,但我是新的python,只是嘗試從Matlab移動,並想了解什麼是利弊。謝謝

回答

7

NumPy和Python數組共享高效存儲在內存中的屬性。

NumPy數組可以加在一起,乘以一個數字,就可以計算一個函數調用中所有值的正弦值等。正如HYRY指出的那樣,它們也可以有多個維度。你不能用Python數組來做到這一點。

另一方面,Python數組確實可以附加到。請注意,NumPy陣列可以連接在一起(hstack(),vstack(),...)。也就是說,NumPy數組主要意味着擁有固定數量的元素。

常見的是首先建立的值的列表(或一個Python陣列)迭代,然後將其轉換爲一個NumPy的陣列(numpy.array(),或者更高效地,具有numpy.frombuffer(),如HYRY提及):這允許數學運算在數組(或矩陣)上執行非常方便(複雜操作的簡單語法)。或者,numpy.fromiter()可能用於從迭代器構造數組。或從loadtxt()構建它從一個文本文件。

7

有使用NumPy的陣列至少有兩個主要的原因:

  • NumPy的陣列需要比Python列表更少的空間。因此,您可以使用Python列表處理NumPy數組(內存中)中的更多數據。
  • NumPy數組有一個龐大的庫函數和方法不可用 到Python列表或Python數組。

是的,你不能簡單地將列表轉換爲NumPy數組,並希望你的代碼繼續工作。方法不同,bool語義不同。爲了獲得最佳性能,甚至可能需要更改算法。

但是,如果你正在尋找一個Python的Python替代品,你肯定會找到用於NumPy的。這是值得學習的。

+1

'array.array'對象*做*有一個'追加()'方法... – EOL 2013-02-27 11:53:02

+0

@EOL:哎呀,你說的很對。 – unutbu 2013-02-27 11:53:52

4

array.array可以動態改變大小。如果您從某個來源收集數據,最好使用array.array。但array.array只是一個維度,並沒有計算功能。所以,當你想用你的數據做一些計算時,將它轉換爲numpy.ndarray,並在numpy中使用函數。

numpy.frombuffer可以創建一個與array.array共享相同數據緩衝區的numpy.ndarray,因爲它不需要複製數據。

這裏是一個演示:

import numpy as np 
import array 
import random 

a = array.array("d") 
# a for loop that collects 10 channels data 
for x in range(100): 
    a.extend([random.random() for _ in xrange(10)]) 

# create a ndarray that share the same data buffer with array a, and reshape it to 2D 
na = np.frombuffer(a, dtype=float).reshape(-1, 10) 

# call some numpy function to do the calculation 
np.sum(na, axis=0) 
+0

用於提及'array.array'和'numpy.frombuffer()'的單維。 – EOL 2013-03-14 01:01:37

相關問題