我对多维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]], [[], []], [[], []], [[], []]]]
实现这一目标的正确方法是什么?
答案 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库