python中sum函数的用法

时间:2017-11-29 14:01:17

标签: python pandas numpy

x_d = np.linspace(-4, 8, 30)

print('x_d shape: ',x_d.shape)
print('x shape: ',x.shape)


density = sum((abs(xi - x_d) < 0.5) for xi in x)---------> difficulty in understanding statement
output:

x_d shape:  (30,)
x shape:  (20,)

我很难理解上述陈述

对于x的每个值,我们从它中减去x_d,我们将获得单个值。但我们的密度为(30,)

我们如何将密度维度设为(30,)

1 个答案:

答案 0 :(得分:3)

表达式

xi - x_d

将使用NumPy broadcasting来符合两个对象的形状。在这种情况下,它意味着将标量值xi视为一个具有所有相同值并且尺寸与x_d相同的数组。

abs函数和less-than比较将与NumPy数组一起使用元素,因此表达式

(abs(xi - x_d) < 0.5)

应该生成长度为30的数组(与x_d大小相同),其中该数组的每个条目都是TrueFalse,具体取决于应用于x_d的每个元素的条件{1}}。

对于xi的多个值重复此操作,导致多个不同的长度为30的数组。

在这些数组上调用sum的结果是它们是元素相加的(也是广播的运气,因为sum函数的默认初始值为0,第一个数组被添加到0元素,保持不变)。

因此,在最终结果中,它将是一个长度为30的数组,其中数组的第0项根据xi的第0个元素计算满足绝对值条件的x_d个值。输出数组的第1项将计算满足xi的第1个元素的绝对值条件的x_d个数,依此类推。

以下是一些测试数据的示例:

In [31]: x_d = np.linspace(-4, 8, 30)

In [32]: x = np.arange(20)

In [33]: x
Out[33]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

In [34]: density = sum((abs(xi - x_d) < 0.5) for xi in x)

In [35]: density
Out[35]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1])