2012-11-12 230 views
6

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

我首先想到的其中之一,但是这是行不通的:

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

这给了我十个向量的载体,有三个[]元素在里面:

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

即,如果我想访问参数[0] [0] [1]我超出范围,而我想要维度2沿着第三维的最内层向量。

然后我想到了这

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

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

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

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

Kd rgds。

回答

17

我会建议你使用Numpy这种东西。它使访问列或行更容易。为了您的使用情况,你会怎么做

import numpy as np 

matrix = np.zeros((2,3,10)) 
second_col = matrix[:,1,:] 

numpy的也会照顾好你的数据,它实现了很多的Fortran和C的矩阵代数所以这将是一个很大的速度(可能)未来当你做矩阵乘法等。

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

首先,你要插入一些进入最里面的列表(如无)。其次,当你在最外面的列表,用乘法它复制引用到内部列表,所以当你改变一个元素,你也将改变所有其他列表中该元素:

>> 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在其他的答案中的一个建议。

4

下面是你正在做的问题之一。

比方说,你要创建一个数组,像这样:

>>> 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:不要在列表列表上使用乘法运算符。