Python:不同类型的多维数组

Ram*_*hum 5 python arrays

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

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

Joe*_*ton 3

如果您使用 numpy,那么 numpy 对象数组是“内存中连续的指针数组”。

然而,它们违背了 numpy 数组的通常目的,并且常常最终成为当前问题的糟糕答案......

(相同类型的连续内存 --> 对整个数组进行快速计算...对象数组不允许这样做,因为它们只是指向 python 对象的指针数组。)。

尽管如此,np.empty((m,n), dtype=np.object)还是做你想做的事。

例如

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
Run Code Online (Sandbox Code Playgroud)

其产量:

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]]]
Run Code Online (Sandbox Code Playgroud)

请注意,它会比“普通”numpy 数组慢得多并且内存效率低得多!(即,None与(numpy,而不是 python)浮点数相比,即使是一个对象也会占用相当多的内存,并且存储在数组中的指针会带来额外的开销。一个大对象数组将使用大量内存!)

但是,如果您实际上需要的是一个多维列表,并且您不打算经常向其追加内容或更改其大小,那么它们可能非常方便。它们本质上相当于 matlab 的元胞数组,虽然 python 中不太需要这种数据结构(python 有列表),但有时它很方便!