2012-11-12 159 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:不要在列表列表上使用乘法運算符。