是否可以在Python中创建不同类型的多维数组?我通常解决它的方式是[([None] * n) for i in xrange(m)]
,但我不想使用list
。我想要的东西实际上是内存中连续的指针数组,而不是列表。 (每个列表本身都是连续的,但是当您创建列表列表时,不同的列表可能会分布在RAM中的不同位置。)
此外,与[([None] * n) for i in xrange(m)]
类似,编写empty_array(m, n)
是一种初始化空数组的复杂方式。还有更好的选择吗?
答案 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
。