Python(2.7)で3D配列を作成して、次のように使用したいと思います。
distance[i][j][k]
そして、配列のサイズは、私が持っている変数のサイズでなければなりません。 (n * n * n)
私は使用してみました:
distance = [[[]*n]*n]
しかし、それはうまくいかないようでした。
何か案は?どうもありがとう!
編集:デフォルトのライブラリのみを使用でき、乗算方法([[0] * n] * n)は機能しません。これらは同じポインタにリンクされており、すべての値が個別である必要があるためです
EDIT2:すでに以下の回答で解決しました。
リスト内包表記 を使用する必要があります。
>>> 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
試したもののようなステートメントでデータ構造を作成することもできますが、内部リストは参照によるコピーであるため、副作用があります。
>>> 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]]]
numpy.array
sは、この場合のためだけに設計されています。
numpy.zeros((i,j,k))
次元ijkの配列を与え、ゼロで埋めます。
必要に応じて、 numpy がニーズに合ったライブラリになる場合があります。
正しい方法は
[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)]
(あなたがやろうとしていることは(NxNxNのように)書かれるべきです
[[[0]*n]*n]*n
しかし、それは正しくありません。@ Adamanのコメントを参照してください)。
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]]
"""
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
を使用することをお勧めします。
すべてを空として初期化することを主張する場合、内側に追加のブラケットセットが必要です([]の代わりに[複製するものはありません」):
distance=[[[[]]*n]*n]*n
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