Pythonで空の10 * 3 * 2配列を作成したいだけです。
私は最初にこれらのことを考えましたが、これは機能していません:
parameters = [ [ [] * 2 ]*3 ] * 10
これにより、3つの[]要素を含む10個のベクトルのベクトルが得られます。
[[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []],
[[], [], []], [[], [], []], [[], [], []], [[], [], []], [[], [], []]]
つまり、parameters [0] [0] [1]にアクセスしたい場合は範囲外ですが、3番目の次元に沿った最も内側のベクトルには次元2が必要です。
それから私はこれを考えました
[ [ [[] * 2] ]*3 ] * 10
[[] * 2]
は今、欲しいもの、つまり最も内側の2つの要素のベクトルをもたらします。私は得る
[[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]],
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]],
[[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]], [[[]], [[]], [[]]]]
それで、それを行う方法、またはこの初期化をエスケープする方法は?
Kd rgds。
この種のものにはNumpyを使用することをお勧めします。列または行へのアクセスがはるかに簡単になります。あなたのユースケースのために
import numpy as np
matrix = np.zeros((2,3,10))
second_col = matrix[:,1,:]
また、Numpyはデータをより適切に処理し、FortranまたはCで行列代数の多くを実装するため、(可能性のある)将来、行列の乗算などを行うときに、はるかに高速になります。
まず、最も内側のリスト(Noneなど)に何かを挿入する必要があります。次に、最も外側のリストで乗算を使用すると、referencesが内側のリストに複製されるため、1つの要素を変更すると、他のすべてのリストでもこの要素が変更されます。
>> 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)]
ただし、他の回答の1つで提案されているように、numpy
を使用することをお勧めします。
私はこのようなことをします、作成されたこのリストを使用して、異なるオブジェクトが作成されます(つまり、異なる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]
これが、あなたがしていることに伴う問題の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]]]
わあ!中に1個セットしましたが、全てが変わりました!それはどうして起こりましたか?
ええと、60個のリストオブジェクトがあるようです。ただし、実際には1つのリストオブジェクトへの60の参照があります。 1つを変更し、すべてを変更します。
TL; DR:リストのリストで乗算演算子を使用しないでください。
# 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)