Python:不同类型的多维数组

时间:2011-02-05 21:23:13

标签: python arrays

是否可以在Python中创建不同类型的多维数组?我通常解决它的方式是[([None] * n) for i in xrange(m)],但我不想使用list。我想要的东西实际上是内存中连续的指针数组,而不是列表。 (每个列表本身都是连续的,但是当您创建列表列表时,不同的列表可能会分布在RAM中的不同位置。)

此外,与[([None] * n) for i in xrange(m)]类似,编写empty_array(m, n)是一种初始化空数组的复杂方式。还有更好的选择吗?

2 个答案:

答案 0 :(得分: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数组相比,它会更慢,内存效率更低! (即使一个None对象占用了相当于一个(numpy,而不是python)浮点数的相当大的内存,并且你得到了存储在数组中的指针的额外开销。一个大对象数组将使用大量的记忆!)

然而,如果您需要的是一个多维列表,并且您不打算附加它或经常更改它的大小,那么它们可能会很方便。它们本质上意味着相当于matlab的单元格数组,虽然python中的那种数据结构的需求较少(python有列表),但有时它很方便!

答案 1 :(得分:2)

在许多情况下,不需要这样的阵列,因为这些问题有更优雅的解决方案。解释你想做什么,这样有人可以提供一些提示。

无论如何,如果真的确实需要这样的数据结构,请使用array.array