python中sum函数的用法

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

解决方法:

表达方式

xi - x_d

将使用NumPy broadcasting使两个对象的形状一致.在这种情况下,这意味着将标量值xi视为与x_d具有相同值和相同尺寸的数组.

Abs函数和小于比较将对NumPy数组逐元素地起作用,因此表达式

(abs(xi - x_d) < 0.5)

应该会导致一个长度为30的数组(大小与x_d相同),其中该数组的每个条目都是true或False,这取决于应用于x_d每个元素的条件.

对于xi的多个值重复此操作,从而导致多个不同的length-30数组.

在这些数组上调用sum的结果是将它们逐个元素地相加(并且由于广播的缘故,由于sum函数认初始值为0,因此第一个数组按元素逐个相加0,保持不变).

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

这是一些测试数据的示例:

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

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...