2011-02-05 102 views
5

是否有可能在Python中創建不同類型的多維數組?我通常解決的方法是[([None] * n) for i in xrange(m)],但我不想使用list。我想要的是內存中的連續數組指針,而不是列表。 (每個列表本身都是連續的,但是當列出列表時,不同的列表可能會散佈在RAM中的不同位置。)Python:不同類型的多維數組

另外,編寫[([None] * n) for i in xrange(m)]是一個相當複雜的初始化空數組的方式,到像empty_array(m, n)。有更好的選擇嗎?

+0

正如之前所說,這不是你想要做的那種考慮。弄清楚你想做什麼(並讓我們知道),我們將幫助你爲它定義數據結構。但是關於Python的一個很棒的事情是,你不必擔心C中的所有低級內存的東西。 – katrielalex 2011-02-05 21:32:52

回答

3

如果你正在使用numpy,numpy對象數組是「內存中連續的指針數組」。

然而,他們擊敗numpy的陣列通常的目的,而且往往被清盤一個不好回答手頭上的問題......

(同一類型的連續內存 - >對整個快速計算數組...對象數組不允許這樣做,因爲它們只是指向python對象的指針數組)。

然而,np.empty((m,n), dtype=np.object)做你想要的。

E.g.

x = np.empty((3,4), dtype=np.object) 
print x 
x[2,3] = range(5) 
x[1,2] = 2 
x[1,3] = (item*2 for item in xrange(10)) 
print x 

其中產量:

Initial array: 
[[None None None None] 
[None None None None] 
[None None None None]] 

Modified array: 
[[None None None None] 
[None None 2 <generator object <genexpr> at 0x8700d9c>] 
[None None None [0, 1, 2, 3, 4]]] 

要知道,這將是非常緩慢,而且要少得多的內存比「正常」 numpy的陣列,高效! (也就是說,與(numpy,而不是python)float相比,即使一個None對象也佔用了相當多的內存空間,並且存儲在數組中的指針會產生額外的開銷。大對象數組將使用大量內存! )

但是,如果您所需要的實際上是一個多維列表,而且您不會經常附加到它或更改其大小,那麼它們可能很方便。它們本質上等同於matlab的單元陣列,雖然python中的這種數據結構的需求較少(python有列表),但有時它很方便!

2

在許多情況下,這些數組並不是必需的,因爲這些問題有更多優雅的解決方案。解釋你想做什麼,這樣有人可以提供一些提示。

無論如何,如果你真的真的需要這樣的數據結構,使用array.array

+0

你是否確認`array.array`在發佈之前允許數組中的不同類型的對象回答? – 2011-02-06 16:48:33