Подтвердить что ты не робот

Создание 3D-массива с использованием Python

Я хотел бы создать 3D-массив в Python (2.7) для использования следующим образом:

distance[i][j][k]

И размеры массива должны быть размером переменной, которую я имею. (П * п * п)

Я попытался использовать:

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

но это, похоже, не работает.

Любые идеи? Большое спасибо!

EDIT: я могу использовать библиотеки deafult, и метод умножения (т.е. [[0] * n] * n) не работает, потому что они связаны с одним и тем же указателем, и мне нужно, чтобы все значения были индивидуальными

EDIT2: уже решен путем ответа ниже.

4b9b3361

Ответ 1

Вы должны использовать понимание :

>>> 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]]]

Ответ 2

numpy.array предназначены только для этого случая:

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

предоставит вам массив размеров ijk, заполненный нулями.

в зависимости от того, что вам нужно, numpy может быть подходящей библиотекой для ваших нужд.

Ответ 3

Правильный путь:

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

(То, что вы пытаетесь сделать, должно быть написано как (для NxNxN)

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

но это неверно, см. комментарий @Adaman почему).

Ответ 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 для многомерных массивов.

Ответ 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]]

Ответ 6

Если вы настаиваете на том, чтобы все инициализировалось как пустое, вам нужен дополнительный набор скобок внутри ([[]] вместо [], так как это "список, содержащий один пустой список для дублирования", а не "список, не содержащий ничего, чтобы дублировать" ):

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

Ответ 7

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