50

次のように使用する Python (2.7) で 3D 配列を作成したいと思います。

distance[i][j][k]

そして、配列のサイズは、私が持っている変数のサイズでなければなりません。( nnn )

私は使用してみました:

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

しかし、それはうまくいかないようでした。

[[0]*n]*nデフォルトのライブラリしか使用できず、同じポインターにリンクされており、すべての値を個別にする必要があるため、乗算 (つまり、) の方法は機能しません。

4

10 に答える 10

77

リスト内包表記を使用する必要があります。

>>> 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]]]
于 2012-05-19T19:57:10.393 に答える
42

numpy.arrays は、この場合専用に設計されています。

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

ゼロで満たされた次元 i j kの配列が得られます。

必要なものによっては、numpyがニーズに適したライブラリになる場合があります。

于 2012-05-19T19:47:03.867 に答える
8

正しい方法は

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

(あなたがしようとしていることは (NxNxN の場合) のように書く必要があります。

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

しかし、それは正しくありません。@Adaman のコメントの理由を参照してください)。

于 2012-05-19T19:46:05.913 に答える
5
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]]
于 2013-03-09T13:23:04.257 に答える
4
"""
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多次元配列に使用することをお勧めします。

于 2016-03-01T11:26:26.720 に答える
1
n1=np.arange(90).reshape((3,3,-1))
print(n1)
print(n1.shape)
于 2021-03-14T07:08:51.347 に答える
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
于 2014-01-20T13:43:49.410 に答える
-2

すべてを空として初期化することを主張する場合は、内側に追加の括弧のセットが必要です ([[]] の代わりに [[]]。重複するものはありません」):

distance=[[[[]]*n]*n]*n
于 2012-05-19T19:49:25.327 に答える