Как кратко посчитать эту сумму?

Я пытаюсь подвести итог моделированию на Python. Математическая формула:

sum(f_i*c_i) for i=1 until i=5

Как я могу вложить эту сумму в Python, не вводя каждый термин? Раньше я определял f1 как f5 и c1 как c5.

Вместо того, чтобы определять fn, cn как отдельные переменные, добавьте их в списки. Затем вы можете использовать sum и zip, чтобы перебирать их попарно.

meowgoesthedog 10.01.2019 15:08

Не создавайте отдельные переменные. Используйте списки, чтобы вы могли легко ссылаться на отдельные значения (с помощью индексации или итерации).

Martijn Pieters 10.01.2019 15:08

В основном просто sum(f[i]*c[i]) for i in range(5)), при условии, что f и c представляют собой списки из 5 элементов. Или sum(fi*ci for fi, ci in zip(f, c))

tobias_k 10.01.2019 15:09
Почему в 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
3
132
7

Ответы 7

Если вам нужна свобода изменения интервалов между f и c (например, f[1:5] и c[5:9]), вы можете использовать заархивированные фрагменты. Имейте в виду, что итерации в Python имеют нулевой индекс и что фрагмент содержит начальную, но не конечную точку. Таким образом, f[1:5] содержит четыре элемента, начиная с индекса 1.

f = [1,2,3,4,5,6,7,8,9]
c = [10,11,12,13,14,15,16,17,18,19]

print(sum([i*j for i, j in zip(f[1:5], c[1:5])]))
f[1:5] будет содержать всего 4 элемента.
tobias_k 10.01.2019 15:10

@tobias_k Я знаю, в том-то и дело. Я не уверен, предполагал ли OP инклюзивный или эксклюзивный подход, но я уверен, что они могут понять, как настроить срез.

Bram Vanroy 10.01.2019 15:11

Почему неуверен? Обозначение математической суммы всегда включает пределы. Таким образом, суммируйте по [: 5] (что изменяет индексы с 1..5 на 0..4) или суммируйте по 1..5, заканчивая диапазон на 6.

alexis 10.01.2019 15:14

Думаю, это обсуждение неуместно. Просто включите в свой ответ строчку, что 1: 5 означает 4 элемента, а [1: 6] означает 5 элементов, 0 - это первый индекс, а 1 - второй индекс. Так все счастливы. ОП может сам решить, что ему действительно нужно.

Sheldore 10.01.2019 15:18

Один из способов суммирования многих переменных - сохранить их в list и просмотреть список с помощью цикла for. Я предполагаю, что у вас объявлены все переменные c и f.

c_numbers = [c1, c2, c3, c4, c5]
f_numbers = [f1, f2, f3, f4, f5]

result = 0
for i in range(len(c_numbers)):
  result += c_numbers[i]*f_numbers[i]

Вы пытались запустить этот код и посмотреть, работает ли он вообще?

Sheldore 10.01.2019 15:15

Помимо использования списков, если у вас большой набор данных, вы также можете использовать массивы NumPy, которые позволяют поэлементное умножение, просто используя оператор умножения *. Затем вы можете суммировать значения с помощью np.sum. Ниже приведен пример с использованием небольшого набора данных.

import numpy as np

a = np.array([1,2,3,4,5])
b = np.array([10, 11, 12, 13, 14])

total = np.sum(a*b)

# 190

Как предлагает @ Безумный физик, то, что вы хотите, это в основном точечный продукт. Так что вы также можете сделать,

a.dot(b)

Почему не a.dot(b)? Голосование против не мое, но маловероятно, что вы получите значимый ответ от человека, который не хочет его оставлять.

Mad Physicist 10.01.2019 15:39

@MadPhysicist: Отличное предложение. Добавлю :) Спасибо

Sheldore 10.01.2019 15:39

Кажется, что вам нужно сделать предварительное создание списков.

f = [1,2,3,4]
c = [3,4,5,6]
my_sum = 0

for i in range(5):
        my_sum = my_sum+f[i]*c[i]

Совет: избегайте использования встроенных функций и имен переменных.

Sheldore 10.01.2019 15:16

Имя переменной f_i не становится именем переменной f1 только потому, что оно находится рядом с определением другой переменной с именем i. Что вы хотите сделать, так это вычислить имя переменной на основе значения i. В Python это можно сделать с помощью списка:

f = [1,2,3,4,5]
c = [2,4,6,8,10]

После того, как вы это сделаете, f[1] (не f1) будет иметь значение 2 (а не 1, потому что индексы списка отсчитываются от нуля).

Тогда ты можешь сделать

sum(f[i] * c[i] for i in range(5))

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

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

c = [1, 2, 3, 4, 5]
f = [0.1, 0.3, 0.2, 0.5, 0.4]

Теперь вы можете получить доступ к данным c[0], ..., c[4], а не к c_1, ..., c_5. Индекс отсчитывается от нуля.

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

cf = [(1, 0.1), (2, 0.3), (3, 0.2), (4, 0.5), (5, 0.4)]

То, что вы раньше называли c_1, будет первым элементом первого кортежа: cf[0][0]. Точно так же f_5 будет вторым элементом последнего кортежа: cf[4][1].

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

sum(i * j for i, j in zip(f, c))

ИЛИ

sum(i * j for i, j in fc)

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

Если вы много занимаетесь анализом данных, возможно, вам стоит заглянуть в вычислительные библиотеки Python. Самым фундаментальным из них является numpy, который позволяет хранить данные в плотно упакованных массивах и выполнять над ними быстрые векторизованные операции.

Чтобы преобразовать список в массив:

 f = np.array(f)
 c = np.array(c)

Сумма продуктов теперь просто для продукта:

c.dot(f)

Или вы можете вычислить это «вручную»:

(c * f).sum()

В качестве альтернативы вы могли бы сделать

fc = np.array(fc)

fc теперь будет матрицей из двух столбцов, поэтому вы можете сделать что-то вроде:

fc[:, 0].dot(fc[:, 1])

ИЛИ

fc.prod(axis=1).sum()

«Питонический» способ сделать это - использовать встроенные функции zip() и sum() для создания пар каждого термина и вычисления итога.

f1, f2, f3, f4, f5 = 1, 2, 3, 4, 5
c1, c2, c3, c4, c5 = 6, 7, 8, 9, 10

f = [f1, f2, f3, f4, f5]
c = [c1, c2, c3, c4, c5]

print( sum(fi * ci for fi, ci in zip(f, c)) )  # -> 130

Очевидно, было бы более кратко хранить данные непосредственно в двух списках, если это возможно:

f = [1, 2, 3, 4, 5]
c = [6, 7, 8, 9, 10]

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