代码之家  ›  专栏  ›  技术社区  ›  Leonid

没有循环的python多维数组初始化

  •  9
  • Leonid  · 技术社区  · 14 年前

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

    12 回复  |  直到 6 年前
        1
  •  13
  •   John La Rooy    14 年前

    肯定有 一种方式

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

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

    但这是可怕和浪费的,所以每个人都使用循环(通常是列表理解)或麻木

        2
  •  9
  •   Eric O. Lebigot    11 年前

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

    例如,可以使用

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

    (初始化为 任意值 )或者创建相同的数组 零点 到处都有

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

    对于数组操作,numpy非常快。

        3
  •  7
  •   Jacob Mattison    14 年前

    当然,你可以

    mylist = [
                [1,2,3],
                [4,5,6],
                [7,8,9]
             ]
    
        4
  •  4
  •   Jens Nyman    9 年前

    以下内容不使用任何特殊库,也不使用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
  •  3
  •   user108088    14 年前

    我不相信这是可能的。

    你可以这样做:

    >>> 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)]
    
        6
  •  3
  •   razpeitia    14 年前

    递归是你的朋友: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)
    
        7
  •  2
  •   John Kugelman Michael Hodel    14 年前

    这取决于您要将数组初始化为什么,但可以肯定。可以使用列表理解创建一个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]]
    

    是的,我想这仍然有循环,但都是在一行中完成的,我想这就是你问题的原意?

        8
  •  2
  •   Arnab Datta    11 年前
    a = [[]]
    a.append([1,2])
    a.append([2,3])
    

    然后

    >>> a
    [[1, 2], [2, 3]]
    
        9
  •  1
  •   Brian Hawkins    14 年前

    如果你在用numpy做数值计算,比如

    x = numpy.zeros ((m,n))
    x = numpy.ones ((m,n))
    
        10
  •  1
  •   Luke404    14 年前

    巨蟒没有 数组 . 它还有其他的序列类型,从列表到字典,没有忘记集合——正确的序列类型取决于您的特定需求。

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

    • 对于n次:对于m次:添加元素
    • N次:添加一行m元素
    • 把整件事都写出来

    你说你不想循环,这就排除了前两点,但为什么呢? 你还说你不想写下这件事(作为对雅各布的回应),那么你会怎么做呢?我不知道任何其他的方法来获得一个数据结构,而不是用更小的片段(循环)生成它,或者用任何编程语言显式地写下来。

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

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

        11
  •  0
  •   0xAliHn    6 年前

    你可以这样做:

    首先,不使用任何循环:

    [[0] * n] * m
    

    其次,使用简单的内联列表理解:

    [[0 for column in range(n)] for row in range(m)]
    
        12
  •  -2
  •   Mythical_Ewe    9 年前

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