如何有效地从10,000个Python列表中选择第i个项目并将其有效地转换为列表?

时间:2018-06-26 23:03:05

标签: python histogram

我正在研究Monte Carlo算法。本质上,由于涉及时间,因此每次迭代都会生成一个列表,其中包含50个项目,涵盖了50年的仿真。我附上这些内容,以便有一个包含10,000个元素的列表,每个元素都是50个数字的列表。

现在,当然,我需要将每年的数据放入一个包含10,000个项目的列表中,以便进行年度直方图分析。

举一个简单的例子,如果我有5次运行3年的数据,则可能会有一个看起来像这样的列表:

[[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

,我需要将其放入类似如下的列表中:

[[1, 1.1, 2.1], [2, 2.2, 2.6], [3, 3.3, 2.7], [4, 4.4, 2.8], [5, 5.5, 2.9]]

很显然,我可以使用双循环来强行执行此操作,但是对于50万个数据点,我正在寻找更高效和Pythonic的东西。

是否有人对内部(或程序包)有足够的了解,可以使这种情况快速有效地发生?

3 个答案:

答案 0 :(得分:2)

您可以使用zipnumpy.transpose(可能更快):

d = [[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

zip(*d) # returns a generator in Python3, use list on top of it if needed

import numpy as np
np.transpose(d) # returns a np.array, which will behave more or less the same as a Python list
# or simply something like 
arr = np.array(d)
arr[:,i] # returns the i-th values in each row

答案 1 :(得分:1)

您可以zip列表:

x = [[1,2,3, 4,5], [1.1, 2.2, 3.3, 4.4, 5.5], [2.5, 2.6, 2.7, 2.8, 2.9]]

y = zip(*x) #Unpacking elements of x before zipping

print(list(y))
>>>[(1, 1.1, 2.5), (2, 2.2, 2.6), (3, 3.3, 2.7), (4, 4.4, 2.8), (5, 5.5, 2.9)]

答案 2 :(得分:1)

列表是灵活的项目;结果,它们很慢。由于您具有固定宽度的环境,因此请使用增强的结构。对于初学者,NumPy 2D阵列应该会有所帮助。您不必将其强制改变方向:只需使用提供的矢量表达式,并强制NumPy进行所需的矢量化(假设您的处理器支持这些矢量化)。