2012-11-12 10 views
6

空の10 * 3 * 2配列をPythonで作成したいだけです。空行列を作成するPython

私が最初にこれらの1と考え、これは動作していない:

ある
[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []], 
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]] 

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

これは、その中に3 []の要素で、私の10個のベクトルのベクトルを与えます私がパラメータ[0] [0] [1]にアクセスしたいのであれば、私は範囲外ですが、私は第3次元に沿って最も内側のベクトルの次元2を求めています。

その後、私は[[] * 2]は今私が欲しいもの、最も内側の二つの要素ベクトルをもたらすだろうと考えていたこの

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

考えます。私は得る

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

だから、どのようにするか、この初期化をエスケープするには?

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

あなたのしていることの問題の1つがここにあります。

のは、あなたがそうのように、配列を作成しているとしましょう:

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

Woah!私たちは1つのアイテムをセットしましたが、すべてが変わりました!どうしたの?

私たちには60個のリストオブジェクトがあるようです。しかし、実際には1つのリストオブジェクトに対して60の参照があります。 1つを変更し、すべてを変更します。

TL; DR:リストのリストで乗算演算子を使用しないでください。

関連する問題