繁体   English   中英

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

[英]Python multi-dimensional array initialization without a loop

有没有办法在Python中初始化多维数组/列表而不使用循环?

当然还有一种方法

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

要么

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

但它太可怕了,浪费了,所以每个人都使用循环(通常是列表推理)或numpy

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

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

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

(使用任意值初始化)或创建具有随处可见的相同数组

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

对于阵列操作,Numpy非常快。

当然,你可以做到

mylist = [
            [1,2,3],
            [4,5,6],
            [7,8,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]]

我不相信这是可能的。

你可以这样做:

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

递归是你的朋友: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)
a = [[]]
a.append([1,2])
a.append([2,3])

然后

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

这取决于你初始化数组的内容,但肯定。 您可以使用列表推导来创建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]]

是的,我想这仍然有循环 - 但它都是在一行中完成的,我认为这是你问题的意图?

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

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

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

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

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

你说你不想循环,排除前两点,但为什么呢? 你也说你不想把事情写下来(回应雅各布),你怎么会这样做呢? 我不知道有任何其他方式来获取数据结构,而无需在任何编程语言中以较小的部分(循环)或明确地将其写下来。

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

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

你可以这样做:

首先不使用任何循环:

[[0] * n] * m

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM