创建空矩阵Python

时间:2012-11-12 16:32:08

标签: python arrays vector matrix initialization

我只是想用Python创建一个空的10 * 3 * 2数组。

我首先想到了这一个,但这不起作用:

parameters = [ [ [] * 2 ]*3 ] * 10

这给了我一个十个向量的向量,其中有三个[]元素:

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

也就是说,如果我想访问参数[0] [0] [1]我不在界外,而我想要第三维最内层向量的维度2。

然后我想到了这个

[ [ [[] * 2] ]*3 ] * 10

我在想[[] * 2]现在会给我带来我想要的东西,一个最内在的两个元素向量。我获得了

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

那么,怎么做,或者如何逃避这种初始化?

Kd rgds。

6 个答案:

答案 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提出的问题