Составьте список из двух индексов в Pyomo (Python) - PullRequest
0 голосов
/ 29 апреля 2018

Доброе утро,

Я искал в интернете способ составить список или таблицу с двумя индексами. В настоящее время я построил код для 1 индекса, равный mass = list(range(0,value(m.n)+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). Подумайте, можно ли будет создать такой список, таблицу или матрицу, как вы хотите это назвать, но будет очень полезно узнать это, потому что я застрял из-за этого.

Мой код выглядит следующим образом:

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).

1 Ответ

0 голосов
/ 04 мая 2018

Используйте словари вместо списков. Словари могут быть дважды проиндексированы, что сделает их индексируемыми кортежами.

Написание ваших параметров должно быть:

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

Где setOfIndiceA и setOfIndiceB - наборы, в которых содержатся первые (A) и вторые (B) индексы вашего словаря.

Если (a,b) кортежей из ваших индексов редки (не все значения набора A соответствуют значению набора B и наоборот), используйте один единственный набор кортежей, например

listOfIndicesAB = [(1,1),(1,3),(2,1),(2,4)]
setOfIndicesAB = Set(initialize=listOfIndicesAB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...