【问题标题】:Python: Multi-dimensional array of different typesPython:不同类型的多维数组
【发布时间】:2011-02-05 21:23:13
【问题描述】:

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

另外,与empty_array(m, n) 相比,编写[([None] * n) for i in xrange(m)] 是一种相当复杂的初始化空数组的方式。有没有更好的选择?

【问题讨论】:

  • 如前所述,这不是您想要做的那种考虑。弄清楚你想做什么(并让我们知道),我们将帮助你定义它的数据结构。但是 Python 的一大优点是您不必担心 C 中的所有低级内存内容。

标签: python arrays


【解决方案1】:

如果您使用的是 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 有列表),但有时它很方便!

【讨论】:

    【解决方案2】:

    在许多情况下,不需要这样的数组,因为这些问题有更优雅的解决方案。说明您想做什么,以便有人可以提供一些提示。

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

    【讨论】:

    • 在发布答案之前,您是否确认 array.array 允许数组中包含不同类型的对象?
    猜你喜欢
    • 2021-05-20
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多