如何以简洁的方式计算此和?

时间:2019-01-10 14:06:41

标签: python math sum

我正在尝试对Python的某些建模进行总结。数学公式为:

  

i = 1的总和(f_i * c_i)直到i = 5

如何在不输入每个术语的情况下在Python中放入该金额?我之前将f1定义为f5,并且将c1定义为c5

7 个答案:

答案 0 :(得分:0)

如果您希望自由更改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])]))

答案 1 :(得分:0)

对多个变量求和的一种方法是将它们存储在list中,并使用for循环遍历列表。我假设您已经声明了所有cf变量。

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]

答案 2 :(得分:0)

除了使用列表之外,如果您有大型数据集,则还可以使用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)

答案 3 :(得分:0)

您似乎需要预先创建列表。

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]

答案 4 :(得分:0)

变量名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))

答案 5 :(得分:0)

通常,新手经常会想到在变量名称中可以有一个索引。因为变量名是字符串,所以实际上这会引起更多的问题。除了通过动态生成的名称访问变量的相对困难之外,还存在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()

答案 6 :(得分:0)

一种“ Python式”的方法是使用内置的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]