繁体   English   中英

Python:不同类型的多维数组

[英]Python: Multi-dimensional array of different types

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

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

如果您使用的是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数组慢得多,内存使用效率也要低得多! (即,与(numpy,而不是python)浮点数相比,即使None对象也占用相当多的内存,并且您还有指针存储在数组中的额外开销。大对象数组将占用大量内存! )

但是,如果您实际上需要的是多维列表,而又不想频繁地添加到该列表或更改其大小,则可以方便地使用它们。 从本质上讲,它们等效于matlab的单元格数组,尽管python中不需要那种数据结构(python有列表),但有时很方便!

在许多情况下,不需要阵列,因为对于这些问题有更完善的解决方案。 说明您要做什么,以便有人可以给出一些提示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM