2012-05-19 3 views
23

を用いた3次元配列を作成します。 (N * n個の* n)では、Python

私が使用してみました:

distance = [[[]*n]*n] 

をそれが動作していないようでした。

アイデア?どうもありがとう!

EDIT:私は、同じポインタにリンクされているため、すべての値を必要とするため、デフュルトライブラリのみを使用できます([[0] * n] * n)は機能しません。個別

EDIT2:既に以下の回答で解決済みです。

+0

標準の 'array'モジュールの' array'クラスの使用を検討してください。 – martineau

答えて

44

あなたはlist comprehensionを使用する必要があります。

>>> import pprint 
>>> n = 3 
>>> distance = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)] 
>>> pprint.pprint(distance) 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> distance[0][1] 
[0, 0, 0] 
>>> distance[0][1][2] 
0 

あなたが試したもののように見えた文でデータ構造を作成し、それことができました内側のリストはcopy-by-rなので、副作用があったでしょうリファレンス:

>>> distance=[[[0]*n]*n]*n 
>>> pprint.pprint(distance) 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> distance[0][0][0] = 1 
>>> pprint.pprint(distance) 
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 
+0

ありがとう、これはうまくいくようです。私は自分のプログラムでテストし、すぐに結果を返します。 –

5

正しい方法@Adamanコメント理由を参照してください、

[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)] 

(あなたが何をしようとして)NxNxNのため(のように記述する必要があります

[[[0]*n]*n]*n 

もよいが、それは正しくないでしょう)。

+0

いいえ。同じ配列への参照を含みます。これを試してみましょう: 'a = [[0] * 3] * 3; a [0] [0] = 1; print a ' – Amadan

21

numpy.arrayのはまさにこのケースのために設計されています

numpy.zeros((i,j,k)) 

はあなたにゼロで満たされた私J K、次元の配列を与えます。

必要に応じて、が必要なライブラリになる場合があります。

+0

ありがとう、私はこれを試してみる –

+0

ああ、これは嫌な人のライブラリの1つだと思った。私はそれ以外のものを使うことはできません。 –

+1

いいえ、残念ながら、それは外部のライブラリです。通常大規模な数値データの配列を処理する必要がある場合は非常に適しています。特にスピードが問題になる場合。 – mata

0

空に初期化するすべてを主張する場合は、内側に[[]]ではなく["]を追加する必要があります。これは"複製する空リストを1つ含むリスト "です。 「複製することは何も含まないリスト」):

distance=[[[[]]*n]*n]*n 
+1

これをしないでください。そうしないと、すべて同じ参照を指します。 –

+0

はい、私の問題は、私がそれらのうちの1つを変えれば、それもすべてが変わるということです。私はそれらを別々の要素にする必要があります。 –

2
d3 = [[[0 for col in range(4)]for row in range(4)] for x in range(6)] 

d3[1][2][1] = 144 

d3[4][3][0] = 3.12 

for x in range(len(d3)): 
    print d3[x] 



[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 144, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3.12, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
+0

'col'、' row'と 'x'の説明に感謝します! – Gluttton

0
def n_arr(n, default=0, size=1): 
    if n is 0: 
     return default 

    return [n_arr(n-1, default, size) for _ in range(size)] 

arr = n_arr(3, 42, 3) 
assert arr[2][2][2], 42 
3
""" 
Create 3D array for given dimensions - (x, y, z) 

@author: Naimish Agarwal 
""" 


def three_d_array(value, *dim): 
    """ 
    Create 3D-array 
    :param dim: a tuple of dimensions - (x, y, z) 
    :param value: value with which 3D-array is to be filled 
    :return: 3D-array 
    """ 

    return [[[value for _ in xrange(dim[2])] for _ in xrange(dim[1])] for _ in xrange(dim[0])] 

if __name__ == "__main__": 
    array = three_d_array(False, *(2, 3, 1)) 
    x = len(array) 
    y = len(array[0]) 
    z = len(array[0][0]) 
    print x, y, z 

    array[0][0][0] = True 
    array[1][1][0] = True 

    print array 

は、多次元アレイのnumpy.ndarrayを使用することを好みます。