Составьте список из двух индексов в Pyomo (Python)

Доброе утро,

Я искал в Интернете способ составить список или таблицу с двумя индексами. В настоящее время я создал код для 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). 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).

Обеспечьте ввод, требуемый вывод. Ваш вопрос непонятен.

Aniket Bote 29.04.2018 12:06

Я обновил сообщение, я не знаю, было ли это то, о чем вы просили, или нет. Заранее благодарим за ответ.

Manuel Duran Perez 29.04.2018 12:15

Я думаю, что @AniketBote запрашивал минимальный воспроизводимый пример. Другими словами, какой-то код, который мы можем запустить, может воспроизвести ошибку. Хотя на SO есть несколько умных людей, смертным среди нас нужно запустите код, чтобы отладить его за вас.

jpp 29.04.2018 12:18

Я думаю, что сделал работоспособный код, не могли бы вы попробовать его, чтобы увидеть, показывает ли он то, что я от него хочу?

Manuel Duran Perez 29.04.2018 12:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
973
2

Ответы 2

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

Записывать свои параметры следует:

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)

Должен ли я включать разные словари для каждой переменной? Или мне нужно создать новый словарь для каждой переменной с двойными индексами?

Manuel Duran Perez 06.05.2018 19:05

Следует различать переменные и параметры. Только параметры нуждаются в словаре для хранения данных, однако обе переменные И параметры должны иметь наборы для своих индексов (в предыдущем коде: setOfIndicesA). Таким образом, Pyomo сможет узнать домен параметров / переменных. Если в своем комментарии вы имели в виду параметры, то делайте как хотите. Один и тот же словарь можно использовать сколько угодно раз. Лично я использую только словари, так как они более гибкие, чем списки.

V. Brunelle 07.05.2018 04:54

Вам, безусловно, нужно будет создать словарь для каждого параметра с двойным индексом, но не обязательно для параметров с одним индексом (я думаю).

V. Brunelle 07.05.2018 04:55

Я нашел способ конвертировать значения из двумерной переменной 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])

Другие вопросы по теме