【发布时间】:2011-04-09 09:57:10
【问题描述】:
Python中有没有一种方法可以在不使用循环的情况下初始化多维数组/列表?
【问题讨论】:
-
这个问题有点模糊:是要初始化一个空的多维数组,还是要将多维数组初始化为一组特定的值?
标签: python
Python中有没有一种方法可以在不使用循环的情况下初始化多维数组/列表?
【问题讨论】:
标签: python
当然有方法
arr = eval(`[[0]*5]*10`)
或
arr = eval(("[[0]*5]+"*10)[:-1])
但这很可怕而且很浪费,所以每个人都使用循环(通常是列表推导)或 numpy
【讨论】:
eval
根据您的实际需求,事实上的“标准”包Numpy 可能会为您提供您所需要的。
例如,您可以创建一个多维数组
numpy.empty((10, 4, 100)) # 3D array
(使用 任意值 初始化)或使用 zeros 创建相同的数组
numpy.zeros((10, 4, 100))
Numpy 非常快,用于数组操作。
【讨论】:
a = numpy.empty((10, 4, 100)); print a.shape 进行检查。
当然,你可以这样做
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)
【讨论】:
这取决于您将数组初始化为什么,但可以确定。您可以使用列表推导来创建一个 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的时候,那么每个子维度都会指向同一个内存,这不是我想要的。
a = [[]]
a.append([1,2])
a.append([2,3])
然后
>>> a
[[1, 2], [2, 3]]
【讨论】:
如果你正在使用 Numpy 做数值工作,类似
x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))
【讨论】:
Python 没有数组。它具有从列表到字典的其他序列类型,而不会忘记集合 - 正确的序列类型取决于您的特定需求。
假设您的“数组”实际上是一个列表,而“初始化”意味着分配 NxM 个元素的列表列表,您可以(伪代码):
你说你不想循环,这排除了前两点,但为什么呢? 你还说你不想把事情写下来(作为对 JacobM 的回应),那么你会怎么做呢?我不知道任何其他获取数据结构的方法,而无需以较小的部分(循环)生成数据结构或明确写下来 - 使用任何编程语言。
还要记住,一个已初始化但为空的列表并不比没有列表好,除非您将数据放入其中。而且你不需要在放数据之前初始化它...
如果这不是一个理论练习,那么您可能问错了问题。我建议你解释一下你需要用这个数组做什么。
【讨论】:
for 循环来初始化列表。正如 JacobM 建议的那样,您可以静态初始化列表,但我指出它不适用于大型列表。 gnibbler 提出了非常有趣但时髦且低效的方法。
for 循环的初始化,因为从文档中已经很明显你会如何做到这一点。
你可以这样做:
首先不使用任何循环:
[[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
【讨论】: