Как добавить элементы в 3-мерный массив в python

Я пытаюсь сохранить данные в трехмерном массиве i.e, x[0] [0] [0] [0] в python. как инициализировать x. и добавьте к этому ценности. я попробовал.

x=[]
x[0][0][0]=value1 
x[0][0].append(value1)

обе линии дают из ошибки ряда. как это сделать. я хочу, чтобы это было так. x[0][0][0]=value1, x[1][0][0]=value2, x[0][1][0]=value3 etc. как достичь этого в python.

Я ищу, чтобы создать такой массив

x=[[[11,[111],[112]],[12],[13]],[[21,[211],[212]],[22],[23],[24]],[[31],[32]]]
x[0][0][0] will give 11
x[1][0][0]  21
x[0][0][1] 111

etc

7 ответов


Я рекомендую использовать numpy для многомерных массивов. Это делает его намного удобнее и намного быстрее. Это будет выглядеть как

import numpy as np
x = np.zeros((10,20,30)) # Make a 10 by 20 by 30 array
x[0,0,0] = value1

тем не менее, если вы не хотите использовать numpy, или нужны непрямоугольные многомерные массивы, вам нужно будет рассматривать его как список списков списков и инициализировать каждый список:

x = []
x.append([])
x[0].append([])
x[0][0].append(value1)

Edit: или вы можете использовать компактную нотацию, показанную в ответе ndpu (x = [[[value1]]]).


Если вы создаете некоторый 3D разреженный массив, вы можете сохранить все данные в dict:

x={}
x[0,0,0] = 11
x[1,0,0] = 21
x[0,1,1] = 111

или:

from collections import defaultdict
x = defaultdict(lambda :defaultdict(lambda :defaultdict(int)))

x[0][0][0] = 11
x[1][0][0] = 21
x[0][0][1] = 111

Если вы можете использовать numpy, вы можете инициализировать массив фиксированного размера как:

import numpy
x = numpy.zeros((i, j, k))

где i, j и k-требуемые размеры.

затем вы можете индексировать в этот массив, используя нотацию среза:

x[0, 0, 0] = value1
x[1, 0, 0] = value2

>>> x=[[[[]]]]
>>> x[0][0][0]=0
>>> x
[[[0]]]
>>> x[0][0].append(1)
>>> x
[[[0, 1]]]

Я только что придумал это, это более динамично и просто.

# Define how large to make the object.
size = 3

# Build the three dimensional list.
memory = []
for x in range(0,size):
    memory.append([])
    for y in range(0,size):
        memory[x].append([])
        for z in range(0,size):
           memory[x][y].append(0) # Fill with zeros.

# Iterate through all values.
for x in range(0,size):
    for y in range(0,size):
        for z in range(0,size):
            print 'memory[' + str(x) + '][' + str(y) + '][' + str(z) + ']=' + str(memory[x][y][z])

# Example access.
print 'Example access:'
print 'memory[0][1][2]=' + str(memory[0][1][2])

выход:

memory[0][0][0]=0
memory[0][0][1]=0
memory[0][0][2]=0
memory[0][1][0]=0
memory[0][1][1]=0
memory[0][1][2]=0
memory[0][2][0]=0
memory[0][2][1]=0
memory[0][2][2]=0
memory[1][0][0]=0
memory[1][0][1]=0
memory[1][0][2]=0
memory[1][1][0]=0
memory[1][1][1]=0
memory[1][1][2]=0
memory[1][2][0]=0
memory[1][2][1]=0
memory[1][2][2]=0
memory[2][0][0]=0
memory[2][0][1]=0
memory[2][0][2]=0
memory[2][1][0]=0
memory[2][1][1]=0
memory[2][1][2]=0
memory[2][2][0]=0
memory[2][2][1]=0
memory[2][2][2]=0
Example access:
memory[0][1][2]=0

компиляция методов выше в отношении эффективного создания двумерного дикт - это:

from collections import defaultdict
x = defaultdict(lambda :defaultdict())
x["a"]["b"] = 123
x["a"]["c"] = 234
x["b"]["a"] = 234    
x["b"]["c"] = 234    
x["c"]["a"] = 234
x["c"]["b"] = 234
for i in x: 
    for j in x[i]: print i, j, x[i][j]

выдает:

a c 234
a b 123
c a 234
c b 234
b a 234
b c 234

чтобы увеличить количество измерений (например, до трех измерений), просто увеличьте лямбда - "гнездо", как показывает HYRY:

x = defaultdict(lambda :defaultdict(lambda :defaultdict(int)))

Interator. Я использую функцию lambda для создания матрицы с [ [ 0 для j в диапазоне (n)] для i в диапазоне(m)] в python 3. В версии 2. используемые функции карте. В этот момент подумайте, как использовать array module (pure python) для создания матриц.

>>> arr = lambda m,n,l : [ [ [0 for k in range(l)] for j in range(n)] for i in range(m) ]
>>> m = arr(2,3,4)
>>> m
    [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]