在Python中编辑多维数组

时间:2015-01-10 00:14:01

标签: python arrays multidimensional-array

我对多维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]], [[], []], [[], []], [[], []]]]

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

2 个答案:

答案 0 :(得分:6)

当你做

时,问题确实存在
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)]

答案 1 :(得分:0)

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

随意熟悉NumPy