【问题标题】:Python multi-dimensional array initialization without a loop没有循环的Python多维数组初始化
【发布时间】:2011-04-09 09:57:10
【问题描述】:

Python中有没有一种方法可以在不使用循环的情况下初始化多维数组/列表?

【问题讨论】:

  • 这个问题有点模糊:是要初始化一个空的多维数组,还是要将多维数组初始化为一组特定的值?

标签: python


【解决方案1】:

当然有方法

arr = eval(`[[0]*5]*10`)

arr = eval(("[[0]*5]+"*10)[:-1])

但这很可怕而且很浪费,所以每个人都使用循环(通常是列表推导)或 numpy

【讨论】:

  • 将其标记为已接受为最能反映问题。 numpy 不是标准 Python 安装的一部分。
  • 这有创建对相同对象的引用的缺点,请参阅this answer
  • @black_puppydog,不,它没有。这就是为什么这里使用eval
  • 这个答案解释了如何使用 numpy 初始化多维数组:stackoverflow.com/a/3662541/975097
【解决方案2】:

根据您的实际需求,事实上的“标准”包Numpy 可能会为您提供您所需要的。

例如,您可以创建一个多维数组

numpy.empty((10, 4, 100))  # 3D array

(使用 任意值 初始化)或使用 zeros 创建相同的数组

numpy.zeros((10, 4, 100))

Numpy 非常快,用于数组操作。

【讨论】:

  • 嗯...这两个例子会创建一个 10 x 4 x 100 的数组吗?
  • 他们肯定会。您可以通过 a = numpy.empty((10, 4, 100)); print a.shape 进行检查。
【解决方案3】:

当然,你可以这样做

mylist = [
            [1,2,3],
            [4,5,6],
            [7,8,9]
         ]

【讨论】:

  • 你是绝对正确的,我不是在问矩阵 1000 X 1000...
【解决方案4】:

以下没有使用任何特殊库,也没有eval:

arr = [[0]*5 for x in range(6)]

并且它不会创建重复的引用:

>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
 [0, 2, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]]

【讨论】:

    【解决方案5】:

    我不相信这是可能的。

    你可以这样做:

    >>> a = [[0] * 5] * 5
    

    创建一个 5x5 矩阵,但它是重复的对象(你不想要的)。例如:

    >>> a[1][2] = 1
    [[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]
    

    您几乎肯定需要使用某种循环,如下所示:

    [[0 for y in range(5)] for x in range(5)]
    

    【讨论】:

    • >>> a = [[0] * 5] * 5 这有点危险.. 如果你使用零可能会很好。但是,如果您尝试将变量放在那里。您将获得引用相同值的列表列表。例如,当您设置 a[1][1] = 5 - 所有列表的第 1 个位置的项目都为 5!
    【解决方案6】:

    递归是你的朋友:D

    这是一个非常幼稚的实现,但它确实有效!

    dim = [2, 2, 2]
    
    def get_array(level, dimension):
        if( level != len(dimension) ):
            return [get_array(level+1, dimension) for i in range(dimension[level])]
        else:
            return 0
    
    print get_array(0, dim)
    

    【讨论】:

    • 这正是我所追求的,谢谢!我唯一需要注意的是,我更喜欢发送一个缩短的维度数组,而不是两个参数,例如: [get_array(dimension[1:]) for j in xrange(dimension[0])]
    【解决方案7】:

    这取决于您将数组初始化为什么,但可以确定。您可以使用列表推导来创建一个 5×3 数组,例如:

    >>> [[0 for x in range(3)] for y in range(5)]
    [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
    
    >>> [[3*y+x for x in range(3)] for y in range(5)]
    [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]
    

    是的,我想这仍然有循环——但它都是在一行中完成的,我认为这就是你问题的预期含义?

    【讨论】:

    • 那不算使用循环?
    • 文档将其指定为初始化多维列表的一种方式。对于一维列表,可以进行以下初始化list = [5] * 10,但无法使其适用于更多维度。好像你做list = [[5]*5]*5的时候,那么每个子维度都会指向同一个内存,这不是我想要的。
    【解决方案8】:
    a = [[]]
    a.append([1,2])
    a.append([2,3])
    

    然后

    >>> a
    [[1, 2], [2, 3]]
    

    【讨论】:

      【解决方案9】:

      如果你正在使用 Numpy 做数值工作,类似

      x = numpy.zeros ((m,n))
      x = numpy.ones ((m,n))
      

      【讨论】:

        【解决方案10】:

        Python 没有数组。它具有从列表到字典的其他序列类型,而不会忘记集合 - 正确的序列类型取决于您的特定需求。

        假设您的“数组”实际上是一个列表,而“初始化”意味着分配 NxM 个元素的列表列表,您可以(伪代码):

        • N次:M次:添加一个元素
        • N次:添加一行M个元素
        • 把整件事写出来

        你说你不想循环,这排除了前两点,但为什么呢? 你还说你不想把事情写下来(作为对 JacobM 的回应),那么你会怎么做呢?我不知道任何其他获取数据结构的方法,而无需以较小的部分(循环)生成数据结构或明确写下来 - 使用任何编程语言。

        还要记住,一个已初始化但为空的列表并不比没有列表好,除非您将数据放入其中。而且你不需要在放数据之前初始化它...

        如果这不是一个理论练习,那么您可能问错了问题。我建议你解释一下你需要用这个数组做什么。

        【讨论】:

        • 您将深入探讨其中的一些要点 :)) 问题的要点非常简单,它询问它的要求。我想知道人们用于初始化多维 列表 的不同技术,并且对问题的回答完美地反映了我想知道的内容。有些人使用 de-facto 标准 Numpy 库。有些人显然使用for 循环来初始化列表。正如 JacobM 建议的那样,您可以静态初始化列表,但我指出它不适用于大型列表。 gnibbler 提出了非常有趣但时髦且低效的方法。
        • 我特别想知道没有 for 循环的初始化,因为从文档中已经很明显你会如何做到这一点。
        【解决方案11】:

        你可以这样做:

        首先不使用任何循环:

        [[0] * n] * m
        

        其次使用简单的内联列表推导:

        [[0 for column in range(n)] for row in range(m)]
        

        【讨论】:

          【解决方案12】:

          您可以使用 N 维数组(ndarray)。这是文档的链接。 http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-24
            • 1970-01-01
            • 2015-08-01
            • 1970-01-01
            相关资源
            最近更新 更多