Суммирование Python

Я очень новый пользователь Python. Я пытаюсь вычислить суммирующий ряд.

Уравнение

У меня есть таблица со значениями (см. Ниже) для a_(ij) с p = 10.

data = [["a_{ij}", "j=0", "j=1", "j=2", "j=3"],
["i=1", 4.3, 8.3, 2.9, `1.3],
["i=2", 1.4, 4.7, 6,5, 3.2]]

a_(ij)  j = 0  j = 1  j = 2  j = 3
i = 1    4.3    8.3    2.9     1.3
i = 2    1.4    4.7    6.5     3.2
.
.
i = 20   8.34   2.13  7.93   6.322

Вместо того, чтобы писать код отдельно для каждого значения y.

# For i = 1
y_1 = 4.3*10**0 + 8.3*10**1 + 2.9*10**2 + 1.3*10**3

Есть ли более простой способ сэкономить время?

Можете ли вы опубликовать больше кода, чтобы мы знали, как хранится таблица и т. д.?

Jay Calamari 25.06.2018 20:39

Что такое a_(ij), это массив? Как хранятся ваши данные для таблицы? Если вы не знакомы с массивами / списками, вы должны прочитать о них и знать, что вы можете вкладывать их друг в друга.

Ziyad Edher 25.06.2018 20:39

Добро пожаловать в StackOverflow. Пожалуйста, прочтите и следуйте инструкциям по публикации в справочной документации, как было предложено при создании этой учетной записи. Здесь применяется Минимальный, полный, проверяемый пример. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не опишете проблему. Мы сможем вставить ваш опубликованный код в текстовый файл и воспроизвести описанную вами проблему.

Prune 25.06.2018 20:46

A_ (ji) - это просто заголовок моей таблицы. Первая строка и столбец являются заголовком таблицы.

user9990505 25.06.2018 21:12

Кстати, ваш пример расчета y_1 = 4.3*10**4.3 + 8.3*10**8.3 + 2.9*10**2.9 + 1.3*10**1.3 указывает на то, что вы хотите вычислить p в степени a_(ij), а не в степени j, на что указывает опубликованное вами уравнение. Какой показатель правильный?

blhsing 25.06.2018 22:07

Спасибо за @blhsing за указание на мою ошибку. Это под силу j

user9990505 25.06.2018 22:18

@ Герцогиня, я вижу. Я обновил свой ответ ниже, чтобы отразить ваше исправление.

blhsing 25.06.2018 22:25

@Duchess Кроме того, опубликованное вами уравнение указывает на то, что индекс суммирования начинается с 1, а не с 0, но ваш расчет показывает, что вы хотите, чтобы он начинался с 0. Какая нижняя граница верна?

blhsing 25.06.2018 22:36

@blhsing, нижняя граница начинается с нуля.

user9990505 29.06.2018 18:31

@ Герцогиня, я вижу. Тогда уравнение на изображении неверно.

blhsing 29.06.2018 18:33

@Duchess Я только что понял, что zip и starmap не нужны и их можно заменить простым map. Я отредактировал свой ответ, чтобы он стал чище.

blhsing 29.06.2018 21:41
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
11
169
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сохраните a_ (ij) как матрицу. Либо сделайте его 2D-массивом, либо используйте библиотеку тупой и сделайте его матрицей numpy.

Пример 2D-массива:

a = [[4.3, 8.3, 2.9, 1.3],
     [1.4, 4.7, 6.5, 3.2],
     # you've indicated more lines will go here
     [8.34, 2.13, 7.93, 6.322]]

Если a - это что-то, что может быть сгенерировано функцией, я бы рекомендовал сгенерировать ваш 2D-массив таким образом, а не вручную вводить значения.

Затем вы можете реализовать свою формулу как функцию:

def y(i):
    p = 10
    total = 0
    for j in range(1,4):
        total += a[i][j] * p**j
    return total

Теперь вы можете получить значения y для любого значения i, которое вам нравится, вызвав функцию, например. y(1) даст значение y для i = 1.

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

Я пробовал ваш код, но когда мне нужно значение y(1), возвращаемое мне значение неверно по сравнению с ручным расчетом.

user9990505 26.06.2018 01:06

Проверяйте единичные ошибки (Python имеет индекс 0, то есть если a=[1,2,3,4], a[0] = 1, a[1] = 2 и т. д.). Обратите внимание, что на основе суммирования j от 1 до 3, показанного на вашем изображении, вы получите использовать только значения в последних 3 столбцах a, что, на мой взгляд, немного странно и несовместимо с вашими расчетами. Мое предложение состоит в том, чтобы иметь a как 2D-массив и y как функцию. Точная реализация этого вам решать.

WolfLink 26.06.2018 01:48
Ответ принят как подходящий

Вот чистое решение:

>>> a = [
...     [4.3, 8.3, 2.9, 1.3],
...     [1.4, 4.7, 6,5, 3.2]
... ]
>>> p = 10.0
>>> import operator
>>> [sum(map(operator.mul, i, map(p.__pow__, range(len(i))))) for i in a]
[1677.3, 37648.4]

Замените zip на izip и импортируйте izip из itertools, если вы используете python 2.7.

И вот результат ручного расчета, который вы разместили для сравнения:

>>> 4.3*10**0 + 8.3*10**1 + 2.9*10**2 + 1.3*10**3
1677.3

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