我有三个列表,每个列表有200,000个项目。标题为“ config”的第一个列表是配置名称的列表(这些是百叶窗配置)。第二个列表具有每种配置的照度性能(相同的顺序,这意味着config_a001产生的照度值为350)。最后一个列表为每个配置都有一个值(顺序相同,因此config_002的值为0.24)
config = ['config_a001', 'config_a002', ......]
illuminnace = [350, 376, 260, 500, 450,......]
LUR_value = [0.3,0.24,.7,.1,.....]
我需要选择能产生最高照度和最低LUR值的最佳5种配置。如果无法做到这一点,我需要选择LUR值最低的5种最佳配置,但它们的照度应高于特定阈值,例如450。
我知道应该使用遗传算法解决类似问题,但是我在这一领域经验丰富,如果有人提出建议,我将不胜感激。
答案 0 :(得分:1)
您可以考虑将数据组织到pandas DataFrame中:
import pandas as pd
config = ['config_a001', 'config_a002', 'config_a003', 'config_a004', 'config_a005', 'config_a006']
il = [350, 376, 310, 340, 290, 375]
lur = [0.3, 0.24, 0.21, 0.31, 0.24, 0.28]
创建列表字典
d = {'config': config, 'il': il, 'lur': lur}
从字典中创建一个DataFrame对象
df = pd.DataFrame(d)
使用sort_values()
并从config
列中切割前5个结果:
res = df.sort_values(['il', 'lur'], ascending=[False, True])[:5]['config'].values
这将为numpy数组提供配置值。
list(res)
# Result: ['config_a002', 'config_a006', 'config_a001', 'config_a004', 'config_a003']
答案 1 :(得分:1)
给出:
config = ['config_a001', 'config_a002', 'config_a003', 'config_a004','config_a005']
illuminnace = [350, 376, 260, 500, 450]
LUR_value = [0.3,0.24,.7,.1,.3]
如果“优化”是最高的illuminnace
而最低的LUR_value
,则可以将列表压缩在一起以形成数据元组:
>>> list(zip(config,illuminnace,LUR_value))
[('config_a001', 350, 0.3), ('config_a002', 376, 0.24), ('config_a003', 260, 0.7), ('config_a004', 500, 0.1), ('config_a005', 450, 0.3)]
然后使用key
函数对它们进行排序:
>>> sorted(zip(config,illuminnace,LUR_value),key=lambda t: (-t[1],t[2]))
[('config_a004', 500, 0.1), ('config_a005', 450, 0.3), ('config_a002', 376, 0.24), ('config_a001', 350, 0.3), ('config_a003', 260, 0.7)]
如果要过滤,请在zip
之后但在sorted
之前添加一个表达式以根据相关条件进行过滤:
>>> sorted((t for t in zip(config,illuminnace,LUR_value) if t[1]>=450),key=lambda t: (-t[1],t[2]))
[('config_a004', 500, 0.1), ('config_a005', 450, 0.3)]
如果您有更复杂的分组条件,请编写一个自定义键函数来表达它,或者考虑使用itertools.groupby。您当前的示例数据不够完整,无法给出示例。