Вопрос по python-2.7, arrays, python – Создать 3D-массив с помощью Python

31

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

distance[i][j][k]

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

Я пытался с помощью:

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

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

Есть идеи? Большое спасибо!

РЕДАКТИРОВАТЬ: я могу использовать только библиотеки по умолчанию, и метод умножения (т.е. [[0] * n] * n) не будет работать, потому что они связаны с одним и тем же указателем, и мне нужно, чтобы все значения были индивидуальными

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

Рассмотрите возможность использования стандартаarray Модуль & APOS; sarray учебный класс. martineau

Ваш Ответ

7   ответов
6

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

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

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

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

Error: User Rate Limit Exceededa = [[0] * 3] * 3; a[0][0] = 1; print a
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 для многомерных массивов.

52

понимание списка:

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

чтобы все инициализировалось как пустое, вам понадобится дополнительный набор скобок внутри ([[]] вместо [], поскольку это «список, содержащий 1 пустой список, который должен быть дублирован», а не «a» список, не содержащий дубликатов & quot;):

distance=[[[[]]*n]*n]*n
Error: User Rate Limit Exceeded Laís Minchillo
Error: User Rate Limit Exceededdistance[1][2][0].append(1)
3
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]]
27

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

 

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

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

Error: User Rate Limit Exceeded Laís Minchillo
Error: User Rate Limit Exceeded
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

Похожие вопросы