在 Python 中编辑多维数组

Editing multi-dimensional arrays in Python

我对多维 Python "arrays" 的行为有点困惑(实际上是列表的列表,而不是 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]], [[], []], [[], []], [[], []]]]

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

问题真的是当你这样做的时候

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)]

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

随时了解 NumPy 图书馆