2011-02-05 67 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