[英]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元素列表列表,你可以(伪代码):
你说你不想循环,排除前两点,但为什么呢? 你也说你不想把事情写下来(回应雅各布),你怎么会这样做呢? 我不知道有任何其他方式来获取数据结构,而无需在任何编程语言中以较小的部分(循环)或明确地将其写下来。
还要记住,初始化但空的列表并不比没有列表更好,除非您将数据放入其中。 而且在放入数据之前你不需要初始化它......
如果这不是一个理论练习,你可能会问错误的问题。 我建议您解释一下您需要对该数组做什么。
你可以这样做:
首先不使用任何循环:
[[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.