помеченные переменные в Python - PullRequest
0 голосов
/ 29 марта 2020

Я хотел бы определить несколько переменных, которые помечены некоторыми коэффициентами, и эти переменные не связаны друг с другом. Основным примером будут коэффициенты произвольной многомерной функции:

\sum_{i,j,k} c_{i,j,k} G(i, j, k)

В Mathematica я просто написал бы

c[1,1,1] = 1
...
c[1,2,1] = x
...
c[2,3,2] = x^100-x
...
c[10,10,10] = 0

(* Example of use *)
expr = Sum[ c[i,j,k] G(i,j,k), {i,0,10}, {j,0,10}, {k,0,10}}]

, где я определил все коэффициенты вручную. Теперь я пытаюсь сделать то же самое в Python. В настоящее время я реализую это с помощью функции:

import sympy
x = sympy.Symbol("x")
def coeff(a,b,c):
    if (a,b,c) == (1,1,1): return 1
    ...
    elif (a,b,c) == (1,2,1): return x
    ...
    elif (a,b,c) == (2,3,2): return x**100-x
    ...
    else:
        return None

Кажется, она не будет хорошо масштабироваться, если имеется большое количество коэффициентов. Моей первой мыслью сделать это в Python было использование списков, но это работает, только если метки являются последовательными, например, i = 0,1,2, ... что не является моим случаем и не работает, если метки не целые числа. Словари также кажутся заманчивыми, но также кажутся довольно грязными, чтобы определить и добавить коэффициенты после факта. Есть ли лучшая практика для подобных вещей в Python?

1 Ответ

1 голос
/ 30 марта 2020

Не зная больше о SymPy, похоже, вам нужен матричный / многомерный массив. Это могут быть вложенные словари, но в вашем случае я думаю, что это просто словарь, использующий кортеж измерений в качестве ключа.

Синтаксис практически идентичен вашему примеру выше.

c = {}
c[1,1,1] = 1
c[1,2,1] = x
c[2,3,2] = x^100-x
c[10,10,10] = 0

Часть, в которой я не уверен, заключается в том, изменяется ли значение x с течением времени и выполняется ли оно как функция. Если это так, это не сработает, поскольку значение x помещается в словарь, используя любое значение, которое было на момент установки.

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