【问题标题】:Editing multi-dimensional arrays in Python在 Python 中编辑多维数组
【发布时间】:2015-01-10 00:14:00
【问题描述】:

我对多维 Python“数组”(实际上是列表的列表,而不是 numpy 数组)的行为有点困惑。假设我有一个 4 x 4 数组,其条目是 1 x 2 数组(也就是说,4 x 4 数组的条目是包含 2 个列表的列表)。我可以用命令初始化这样一个空数组:

b = [[[[], ]*2, ]*4, ]*4

这将创建以下多维空数组:

[[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]]]

现在我想修改这个 4 x 4 数组的单个条目;例如我想让组件b[0][0] 等于[[1],[2]]

[[[[1], [2]], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]]]

我的期望是以下命令可以完成这项工作:

b[0][0] = [[1],[2]]

但是,这会导致以下矩阵b

[[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]]]

实现这一目标的正确方法是什么?

【问题讨论】:

  • 如果你使用的数组真的那么简单和统一,你应该考虑strong numpy。在这种情况下,您将使用b = numpy.empty((4,4,2), dtype=int)。即使是创建数组的简单步骤也快了 20--30 倍。如果你对数据做任何有趣的事情,numpy 通常比 MightyPork 的(完全有效的)解决方案快数百或数千倍,而且基本上永远不会慢(据我所见)。

标签: python arrays multidimensional-array


【解决方案1】:

问题在于当你这样做时

b = [[[[], ]*2, ]*4, ]*4

您正在复制对相同数组的引用,因此您的新大型多维数组包含对相同数组的许多引用。

这是一个使用 iPython 的示例:

In [22]: a = [[],]*10

In [23]: a
Out[23]: [[], [], [], [], [], [], [], [], [], []]

In [24]: a[1].append(12)

In [25]: a
Out[25]: [[12], [12], [12], [12], [12], [12], [12], [12], [12], [12]]

如需更好地创建数组,请前往here

你想要的可能的解决方案:

m = [[[[] for x in range(2)] for x in range(4)] for x in range(4)]

【讨论】:

  • 哦,我明白了。初始化这样一个空数组以使其组件实际上是独立的正确方法是什么?也许使用numpy 然后转换回列表列表?
  • 您可以使用列表理解来做到这一点,请参阅我链接的问题。在这里复制它会很愚蠢。 NumPy 当然也可以。
  • 为什么需要转换为列表列表?
  • @STU 现在看看我添加了一些可能对你有用的东西
  • 谢谢,现在很清楚了! Andrew_Lvov,我想使用列表列表的原因是因为这是一个长模块的一小部分,它使用+ 连接列表、append 等。所以我应该花一些重要的精力来修改代码所以它适用于numpy 数组而不是列表列表(并且模块的性能在这里不是一个重要方面)。
【解决方案2】:

[[]]*2 将创建一个包含两个对同一个空数组的引用的数组。当您尝试更改其中一个时,另一个引用反映了更改,因为它指向同一个引用。 在您的情况下,每一行都指向同一个数组。当您更改第一个时,您将更改所有四行指向的数组。

随时了解NumPy library

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2021-02-13
    • 2018-08-31
    • 1970-01-01
    • 2017-07-03
    • 2021-05-01
    相关资源
    最近更新 更多