14

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

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

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

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

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

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

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

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

[[] * 2]私は、これで私が望むもの、最も内側の 2 つの要素のベクトルが得られると考えていました。私は得る

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

では、それを行う方法、またはこの初期化を回避する方法は?

Kd rgds.

4

6 に答える 6

25

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

import numpy as np

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

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

于 2012-11-12T16:35:33.190 に答える
24

まず、最も内側のリストに何かを挿入する必要があります(Noneなど)。次に、最も外側のリストで乗算を使用すると、内側のリストへの参照が複製されるため、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)]

ただし、numpy他の回答の1つで提案されているように使用することをお勧めします。

于 2012-11-12T16:41:17.410 に答える
7

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

于 2012-11-12T16:45:32.550 に答える
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]
于 2012-11-12T16:35:39.077 に答える