web-dev-qa-db-ja.com

空の行列を作成Python

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

私は最初にこれらのことを考えましたが、これは機能していません:

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

これにより、3つの[]要素を含む10個のベクトルのベクトルが得られます。

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

つまり、parameters [0] [0] [1]にアクセスしたい場合は範囲​​外ですが、3番目の次元に沿った最も内側のベクトルには次元2が必要です。

それから私はこれを考えました

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

[[] * 2]は今、欲しいもの、つまり最も内側の2つの要素のベクトルをもたらします。私は得る

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

それで、それを行う方法、またはこの初期化をエスケープする方法は?

Kd rgds。

11
kiriloff

この種のものにはNumpyを使用することをお勧めします。列または行へのアクセスがはるかに簡単になります。あなたのユースケースのために

import numpy as np

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

また、Numpyはデータをより適切に処理し、FortranまたはCで行列代数の多くを実装するため、(可能性のある)将来、行列の乗算などを行うときに、はるかに高速になります。

21
Matti Lyra

まず、最も内側のリスト(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を使用することをお勧めします。

19
btel

私はこのようなことをします、作成されたこのリストを使用して、異なるオブジェクトが作成されます(つまり、異なる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]
6

これが、あなたがしていることに伴う問題の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:リストのリストで乗算演算子を使用しないでください。

5
Nick ODell
# 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)
2
V R Haritha