Как рассчитать эту сумму в сжатой форме? - PullRequest
0 голосов
/ 10 января 2019

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

сумма (f_i * c_i) для i = 1, пока i = 5

Как я могу вставить эту сумму в Python без ввода каждого термина? Я определил f1 до f5 и c1 до c5 до.

Ответы [ 7 ]

0 голосов
/ 10 января 2019

В общем, распространенная идея новичка заключается в том, что у вас может быть индекс в имени переменной. Это на самом деле вызывает больше проблем, чем стоит, поскольку имена переменных являются строками. Помимо относительной сложности доступа к переменным по динамически генерируемым именам, у вас есть такие вещи, как 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))

OR

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])

OR

fc.prod(axis=1).sum()
0 голосов
/ 10 января 2019

"Питонический" способ сделать это - использовать встроенные функции 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]
0 голосов
/ 10 января 2019

Имя переменной 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))
0 голосов
/ 10 января 2019

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

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]
0 голосов
/ 10 января 2019

Помимо использования списков, если у вас большой набор данных, вы также можете использовать массивы 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

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

a.dot(b)
0 голосов
/ 10 января 2019

Одним из способов суммирования многих переменных является сохранение их в 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]
0 голосов
/ 10 января 2019

Если вам нужна свобода изменения интервалов между 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])]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...