如何有效地从10000个Python列表中选择第i个项目,并将它们高效地转换为一个列表?

2024-04-25 08:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究蒙特卡罗算法。本质上,由于涉及时间,每次迭代都会生成一个包含50项的列表,涵盖50年的模拟。我附加了这些元素,这样就有了一个包含10000个元素的列表,每个元素都是50个数字的列表。你知道吗

现在,当然,我需要把每年的数据放入一个包含10000个项目的列表中,这样我就可以做年度直方图分析。你知道吗

举个简单的例子,如果我有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]]

显然,我可以用一个双循环来强制实现这个,但是有500000个数据点,我正在寻找更有效和更具python风格的东西。你知道吗

是否有人对内部(或包)有足够的了解,可以快速有效地实现这一点?你知道吗


Tags: 数据项目算法元素列表风格时间数字
3条回答

您可以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)]

您可以使用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

列表是灵活的项目;因此,它们很慢。因为您有一个固定宽度的环境,所以请使用增强的结构。对于初学者来说,numpy2d数组应该会有所帮助。您不必强制它进入另一个方向:只需使用提供的向量表达式,并强制NumPy执行所需的向量化(假设您的处理器支持这些)。你知道吗

相关问题 更多 >