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,)
答案 0 :(得分:3)
表达式
xi - x_d
将使用NumPy broadcasting来符合两个对象的形状。在这种情况下,它意味着将标量值xi
视为一个具有所有相同值并且尺寸与x_d
相同的数组。
abs
函数和less-than比较将与NumPy数组一起使用元素,因此表达式
(abs(xi - x_d) < 0.5)
应该生成长度为30的数组(与x_d
大小相同),其中该数组的每个条目都是True
或False
,具体取决于应用于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])