Python: 不同类型的多维数组
在Python中,能不能创建一个包含不同类型的多维数组呢?我通常的做法是用 [([None] * n) for i in xrange(m)]
,但我不想用 list
。我想要的是一种在内存中真正连续的指针数组,而不是列表。(每个列表本身是连续的,但当你创建一个列表的列表时,这些不同的列表可能会分散在内存的不同地方。)
而且,写 [([None] * n) for i in xrange(m)]
这种方式来初始化一个空数组,感觉有点复杂,不像 empty_array(m, n)
这样简单。有没有更好的方法呢?
2 个回答
在很多情况下,这种数组并不是必须的,因为还有更优雅的解决方案可以解决这些问题。你可以把你想做的事情说出来,这样别人才能给你一些建议。
不过,如果你真的、真的需要这样的数据结构,可以使用 array.array
。
如果你在使用numpy,可能会发现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
这样会得到:
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有列表),但有时候还是挺有用的!