Доброе утро,
Я искал в Интернете способ составить список или таблицу с двумя индексами. В настоящее время я создал код для 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)
.
Я обновил сообщение, я не знаю, было ли это то, о чем вы просили, или нет. Заранее благодарим за ответ.
Я думаю, что @AniketBote запрашивал минимальный воспроизводимый пример. Другими словами, какой-то код, который мы можем запустить, может воспроизвести ошибку. Хотя на SO есть несколько умных людей, смертным среди нас нужно запустите код, чтобы отладить его за вас.
Я думаю, что сделал работоспособный код, не могли бы вы попробовать его, чтобы увидеть, показывает ли он то, что я от него хочу?
Используйте словари вместо списков. Словари могут быть проиндексированы дважды, что позволит индексировать их по кортежам.
Записывать свои параметры следует:
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)
Должен ли я включать разные словари для каждой переменной? Или мне нужно создать новый словарь для каждой переменной с двойными индексами?
Следует различать переменные и параметры. Только параметры нуждаются в словаре для хранения данных, однако обе переменные И параметры должны иметь наборы для своих индексов (в предыдущем коде: setOfIndicesA). Таким образом, Pyomo сможет узнать домен параметров / переменных. Если в своем комментарии вы имели в виду параметры, то делайте как хотите. Один и тот же словарь можно использовать сколько угодно раз. Лично я использую только словари, так как они более гибкие, чем списки.
Вам, безусловно, нужно будет создать словарь для каждого параметра с двойным индексом, но не обязательно для параметров с одним индексом (я думаю).
Я нашел способ конвертировать значения из двумерной переменной 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])
Обеспечьте ввод, требуемый вывод. Ваш вопрос непонятен.