Python 需要一些初学者语法的帮助

Python need for help for some beginner syntax

我刚开始 python,但有以下两行我不明白。

x = np.array(range(1,n+1))
Nx = np.array([(x < x_i).sum() for x_i in x]) / float(n)

更具体的我没看懂

np.array([(x < x_i).sum() for x_i in x])

究竟是什么?

这在 python 中称为 list comprehension。行

Nx = np.array([(x < x_i).sum() for x_i in x]) / float(n)

本质上是 short-hand for

new_list = []
for x_i in x:
    new_elem = (x < x_i).sum()
    new_list.append(new_elem)

Nx = np.array(new_list) / float(n)

我认为 for 循环使理解列表理解的作用变得相当简单。如果您无法理解循环,请使用调试器逐步执行代码并查看每一行的作用。

现在让我们解开每个部分的作用。

对于 numpy 数组,您可以使用常用的比较运算符执行 element-wise 比较。在每次迭代中,我们有数组 xx_i,一个标量,是数组的第 i 个元素。

  • (x < x_i)x 和 returns 的每个元素执行 element-wise 比较,每个元素是 TrueFalse 取决于比较操作的结果。所以本质上我们有一个 new_array 个布尔值,这样第 p 个元素 new_array[p] = x[p] < x_i.
  • .sum()计算这个new_array中所有元素的和。因为 True 计算为 1False 计算为 0.sum() returns [=20= 中 True 值的数量].这是另一种说法 returns “x 中小于 x_i 的元素数量”
  • 现在这些值被列表理解放入列表中。所以 new_list[i] 将是数组 x 中小于 x[i].
  • 的元素数
  • 最后将this转为numpy数组,将this的每个元素除以float(n),即x.
  • 中的元素个数

因此,Nx 是一个数组,使得 Nx 的第 i 个元素是 x 中小于 [=15] 的元素的百分比=] x.

的第一个元素

只需 运行 终端中的每个部分,看看会发生什么。

首先,x 数组是用

创建的
n = 5 # I added this such that n is defined
x = np.array(range(1,n+1))

这会产生 array([1, 2, 3, 4, 5]) 数组。但请注意,您应该改用 np.arange(1, n+1)

现在我们来看第二行。 np.array 的参数是 [(x < x_i).sum() for x_i in x]。这是一个列表理解。创建列表是一种很好的语法。我们可以把它读成“对于列表x中的每个元素x_i,计算(x < x_i).sum()。但是(x < x_i).sum()是什么?我们知道x_i是一个单一的元素,而 x 是数组 [1, 2, 3, 4, 5]。当您将 NumPy 数组与这样的元素进行比较时,您会得到一个包含“True”和“False”的布尔数组。然后 sum()将对元素求和(基本上计算“True”的数量)。然后将此列表理解的结果转换为另一个数组,然后将其元素除以 n.

为了便于理解,让我们分解成更小的块

np.array([(x < x_i).sum() for x_i in x])

1.First部分

for x_i in x 

represent each element in array x

第二部分

x < x_i

return 布尔值

例如:

x = np.array(range(1,9+1))

它创建一个数组[1,2,3,4,5,6,7,8,9]

那么假设我把xi当成9,

(x < 9)

returns 一个布尔值数组

array([ True,  True,  True,  True,  True,  True,  True,  True, False])

第三部分

(x < x_i).sum()

对所有真实值求和,所以当 xi =9 总和为 8

第四部分

np.array([(x < x_i).sum() for x_i in x])

它将所有值存储在数组 Nx 中

让我们先打破np.array([(x < x_i).sum() for x_i in x])
(x < x_i) :是一个布尔表达式,表示其结果为假(或 0)或真(或 1)。
(x < x_i).sum() :会给你列表的总和。
示例:假设 x =array[1,2,3] \

  1. 第一种情况是x_i = 1,所以(x < x_i)会给你array([false,false,false])因为x_i = 0 > 0false,x_i = 0> 1false最后一个x_i = 0 > 2false,
    sum(false,false,false) = sum(0,0,0) = 0\
  2. 第二种情况是x_i = 2,so so (x < x_i)会给你array([ True, False, False]) 所以sum(true,false,false) = sum(1,0,0) = 1\
  3. 第三种情况你会发现 sum(true,true,false) = sum(1,1,0) = 2\

因此,Nx = array([0,1,2])