我正在研究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的东西。
是否有人对内部(或程序包)有足够的了解,可以使这种情况快速有效地发生?
答案 0 :(得分:2)
您可以使用zip
或numpy.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进行所需的矢量化(假设您的处理器支持这些矢量化)。