12

我正在尝试将数据存储在三维数组中,即x[0][0][0]在 Python 中。如何初始化x并为其添加值?我试过这个:

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

两条线都给出超出范围的错误。怎么做?我希望它像:x[0][0][0]=value1x[1][0][0]=value2x[0][1][0]=value3。如何在 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

等等

4

7 回答 7

27

我建议使用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)

编辑:或者您可以使用 ndpu 的答案 ( x = [[[value1]]]) 中显示的紧凑符号。

于 2013-03-16T11:24:45.183 回答
7

如果您正在创建一些 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
于 2013-03-16T12:37:19.417 回答
3

如果可以使用 numpy,则可以将固定大小的数组初始化为:

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

其中 i、j 和 k 是所需的尺寸。

然后,您可以使用切片表示法对该数组进行索引:

x[0, 0, 0] = value1
x[1, 0, 0] = value2
于 2013-03-16T11:22:51.663 回答
3

我刚想出这个,它更加动态和简单。

# 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
于 2018-08-01T02:04:45.980 回答
2
>>> x=[[[[]]]]
>>> x[0][0][0]=0
>>> x
[[[0]]]
>>> x[0][0].append(1)
>>> x
[[[0, 1]]]
于 2013-03-16T11:27:36.390 回答
1

上述关于有效创建二维字典的技术汇编是:

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

要增加维度的数量(例如,增加到三个维度),只需增加 lambda“nest”,如 HYRY 所示:

x = defaultdict(lambda :defaultdict(lambda :defaultdict(int)))
于 2016-12-16T10:18:52.643 回答
0

互动者。我使用函数 lambda 在 python 3 中使用 [ [ 0 for j in range(n)] for i in range(m) ] 创建矩阵。在版本 2 中,使用了 map 函数。在这一刻想像使用数组模块(纯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]]]
于 2017-10-07T12:01:56.237 回答