我只是想用Python创建一个空的10 * 3 * 2数组。
我首先想到了这一个,但这不起作用:
parameters = [ [ [] * 2 ]*3 ] * 10
这给了我一个十个向量的向量,其中有三个[]元素:
[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []],
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]]
也就是说,如果我想访问参数[0] [0] [1]我不在界外,而我想要第三维最内层向量的维度2。
然后我想到了这个
[ [ [[] * 2] ]*3 ] * 10
我在想[[] * 2]
现在会给我带来我想要的东西,一个最内在的两个元素向量。我获得了
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]],
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]],
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]
那么,怎么做,或者如何逃避这种初始化?
Kd rgds。
答案 0 :(得分:20)
我建议你使用Numpy这种东西。它使访问列或行更容易。对于您的用例,您可以
import numpy as np
matrix = np.zeros((2,3,10))
second_col = matrix[:,1,:]
Numpy也会更好地处理你的数据,并且它在Fortran或C中实现了很多矩阵代数,所以当你进行矩阵乘法和类似的时候,在(可能的)未来会更快
答案 1 :(得分:18)
首先,您应该在最里面的列表中插入一些内容(如None)。其次,当您在最外面的列表中使用乘法时,它会将引用复制到内部列表,因此当您更改一个元素时,您还将在所有其他列表中更改此元素:
>> parameters = [ [ [None] * 2 ]*3 ] * 10
>> print parameters
[[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]],
[[None, None], [None, None], [None, None]]]
>> parameters[0][0][1]=1
>> print parameters
[[[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]], [[None, 1], [None, 1], [None, 1]]]
因此,您应该使用列表推导:
>> parameters=[[[None for i in range(2)] for j in range(3)] for k in range(10)]
但是,我建议按照其他答案中的建议使用numpy
。
答案 2 :(得分:6)
我会做这样的事情,使用这个列表创建的是不同的对象(即不同的id()
):
In [96]: [ [ [ []*2] for _ in range(3)] for _ in range(10) ]
Out[96]:
[[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]],
[[[]], [[]], [[]]]]
In [98]: [id(x) for x in lis] #all objects are unique
Out[98]:
[151267948,
151268076,
151268492,
151269164,
151267276,
151265356,
151268140,
151269036,
151265644,
151265964]
In [101]: lis1=[ [ [[] * 2] ]*3 ] * 10
In [102]: [id(x) for x in lis1] # all objects are same, changing one will change
# others as well
Out[102]:
[151278188,
151278188,
151278188,
151278188,
151278188,
151278188,
151278188,
151278188,
151278188,
151278188]
答案 3 :(得分:5)
这是你正在做的事情的一个问题。
假设您正在创建一个数组,如下所示:
>>> l = [ [ [[] * 2] ]*3 ] * 10
>>> l
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]
到目前为止似乎没问题。我们在数组中设置一些东西。
>>> l[0][0][0] = 2
>>> l
[[[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]], [[2], [2], [2]]]
哇!我们在其中设置了1个项目,但它改变了一切!怎么会发生这种情况?
好吧,看来我们有60个列表对象。但是,我们实际上有60个引用一个列表对象。改变一个,改变它们。
TL; DR:不要在列表列表中使用乘法运算符。
答案 4 :(得分:2)
# Creates an n x n matrix in p
n=int(input())
p=[[[] for x in range(1,10)]for x in range(1,10)]
print(p)
答案 5 :(得分:0)
做你想做的事情的正确方法是:
parameters = [ [ [[]] * 2 ]*3 ] * 10
parameters_mat = eval(str(parameters))
或者:
parameters = [ [ ['0'] * 2 ]*3 ] * 10
parameters_mat = eval(str(parameters))
这样你也解决了@btel提出的问题