【问题标题】:Make a list of two indexes in Pyomo (Python)在 Pyomo (Python) 中列出两个索引
【发布时间】:2026-02-08 00:55:01
【问题描述】:

早上好,

我一直在互联网上搜索一种制作具有 2 个索引的列表或表格的方法。目前我已经为mass = list(range(0,value(m.n)+1)) 的1 个索引构建了一个代码,我用这个表达式mass[i] = value(m.mass[i]) 填充了这个列表。

但现在我必须引入另一个具有两个索引的变量,如下所示x[i,j] = value(m.x[i,j])。我试过x = []*value(m.ph)。但我想要的是得到类似x = [value(m.n)]*value(m.ph) 的东西,以表明我有一张这样的桌子。值 (m.n) 作为行和相位 (m.ph) 作为列。

这样做的目的是使用此函数plt.plot(time,x) 绘制这些变量的图形。 Idk 是否可以按照您的意愿调用这种列表、表格或矩阵,但是知道它会非常有用,因为我因此而陷入困境。

我的代码如下:

n = Param(initialize = 10, within = Integers)

N = Set(initialize = range(0,value(m.n)+1))


#What I got

x1 = [0,1,2,3,4,5,6,7,8,9,10]

x = list(range(0,value(m.n)+1))


for i in m.N:
    x[i] = x1[i]


#What I try to do

ph = Param(initialize = 2, within = Integers)
Ph = Set(initialize = range(0,value(m.n)+1))

x2 = [[0,0],[1,1],[2,2],[3,3],[4,4]]

x = []*value(m.ph) 

for i in m.N:
    for j in m.Ph:
        x[i,j] = x2[i,j]

错误如下:

  File "C:/Users/Manuel/Desktop/StackExample.py", line 38, in <module>
    x[i,j] = x2[i,j]

TypeError: list indices must be integers or slices, not tuple 

非常感谢。

编辑:我想要的是在 Python 中创建一个包含两个索引的列表,使这些索引具有我需要的长度,这些长度由 m.n = Param(initialize = 32, within = Integers)m.ph = Param(initialize = 2, within = Integers) 定义。

【问题讨论】:

  • 提供输入,需要的输出。您的问题不清楚。
  • 我已经更新了帖子,我不知道这是你要求的还是不是。提前感谢您的回复。
  • 我认为@AniketBote 要求的是minimal reproducible example。换句话说,我们可以运行一些可以复制错误的代码。虽然 SO 上有一些聪明人,但我们中间的凡人需要运行一些代码来为您调试它。
  • 我想我做了一个可运行的代码,你能试试看它是否显示了我想要的东西吗?

标签: python list matrix indexing pyomo


【解决方案1】:

使用字典而不是列表。字典可以被双重索引,这将使它们被元组索引。

编写你的参数应该是:

paramName = Param(setOfIndiceA, setOfIndiceB, initialize=aDictionary)

setOfIndiceAsetOfIndiceB 是包含字典的第一个 (A) 和第二个 (B) 索引的集合。

如果您的索引中的 (a,b) 元组是稀疏的(并非集合 A 的所有值都对应于集合 B 的值,反之亦然),请使用一组元组,例如

listOfIndicesAB = [(1,1),(1,3),(2,1),(2,4)]
setOfIndicesAB = Set(initialize=listOfIndicesAB)

【讨论】:

  • 我应该为每个变量包含一个不同的字典吗?还是我必须为每个具有双索引的变量创建一个新字典?
  • 必须区分变量和参数。只有参数需要一个字典来保存数据,但是,变量和参数都需要为其索引设置集(在前面的代码中:setOfIndicesA)。这样,Pyomo 就有可能知道参数/变量域。如果在您的评论中,您的意思是参数,那么按照您的意愿去做。同一个字典可以根据需要多次重复使用。我个人只使用字典,因为它们比列表更灵活。
  • 您当然需要为每个双索引参数创建一个字典,但不一定为单索引参数创建一个字典(我认为)。
【解决方案2】:

我找到了一种将值从二维 pyomo 变量转换为二维列表的方法。我不确定这是否是您要寻找的,但我从标题中了解到。我假设你用数字索引你的变量

from pyomo.environ import *

model = ConcreteModel()

# Setup a two dimensional pyomo variable
model.set1 = RangeSet(0, 10)
model.set2 = RangeSet(0, 5)
# initialize with any number as example
model.variable = Var(model.set1, model.set2, initialize=3)
# do your optimization...

# Create an empty list with the same dimensions as the indexed variable
converted_list = [[None for j in range(len(model.set2))]
                  for i in range(len(model.set1))]

#call all touples and values from the variable class
#call the touple values from the dictionary and use them two index the list
for index in model.variable:
    converted_list[index.__getitem__(0)][index.__getitem__(
        1)] = model.variable[index].value

print(converted_list)

如果您使用变量进行优化,这将为您提供初始化数据或解决方案。

[[3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3 , 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3 ], [3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3, 3, 3, 3, 3], [3, 3, 3 , 3, 3, 3]]

您可以从中调用这样的值:

print(converted_list[1][3])

【讨论】: