【问题标题】:How to add elements to 3 dimensional array in python如何在python中将元素添加到3维数组
【发布时间】:2013-03-05 02:57:17
【问题描述】:

我正在尝试将数据存储在三维数组中,即 Python 中的x[0][0][0]。如何初始化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

等等

【问题讨论】:

  • 先把x做成三维。
  • 它不是一个 3 维数组,它是一个列表列表的列表。如果您想使用它,您需要手动完成所有工作。
  • @Volatility 怎么做?
  • @wRAR 手动?
  • @lok​​esh 创建所有中间列表

标签: python arrays multidimensional-array


【解决方案1】:

我建议将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]]]) 中显示的紧凑符号。

【讨论】:

  • buses[0]=[] IndexError: list assignment index out of range.. 我对使用 numpy 不感兴趣。没有numpy怎么办?
  • @lok​​esh 您无法为不存在的项目分配值。请阅读如何在 Python 中使用列表。
  • @lok​​esh:我最初的回答有点太快了。我现在已经编辑过了。顺便说一句,你为什么不想使用 numpy?
  • 我可以使用它。但是我怎样才能不初始化为固定数组。我的意思是我一开始不知道我的数组大小。
  • 在这种情况下,我通常将所有元素附加到一个一维的平面列表中,然后,当我读完时,将其转换为一个 numpy 数组并将其重新整形为正确的,三个维形状。 IE。类似a = np.array([float(word) for line in file for word in line]); a = np.reshape(a, (a.size/10,10))。但是当然,先构建完整的多维列表,然后将其转换为数组也没有错。
【解决方案2】:

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

# 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

【讨论】:

    【解决方案3】:

    交互者。我使用函数 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]]]
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您正在创建一些 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
        

        【讨论】:

        • 我想要一些可变的东西。 x={} 我无法为其设置项目。
        • 什么是“x={} 我不能给它设置项目”是什么意思?
        • 在您的建议中我想删除 x[0,0,0]。 x 创建后如何删除。
        • 在你的例子中 len(x) 是三。我怎样才能根据这个索引访问每一个。例如 x(1) 应该分别给出 11。
        【解决方案6】:
        >>> x=[[[[]]]]
        >>> x[0][0][0]=0
        >>> x
        [[[0]]]
        >>> x[0][0].append(1)
        >>> x
        [[[0, 1]]]
        

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

          • 我的数组大小不固定。我可以初始化变量大小吗
          猜你喜欢
          • 1970-01-01
          • 2022-06-10
          • 2019-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-19
          相关资源
          最近更新 更多