我现在正在学习Python,而我却在网上找到了这行代码。我不明白这行代码的实际作用。
假设我有这个数组:
import numpy as np
x = np.array ([[1,5],[8,1],[10,0.5]]
y = x[np.sqrt(x[:,0]**2+x[:,1]**2) < 1]
print (y)
结果是一个空数组。我想知道的是 y 的实际作用是什么?我以前从未遇到过这种代码。似乎方括号就像 if-conditional 语句。如果不编写该代码,请编写以下代码:
import numpy as np
x = np.array ([[1,5],[8,1],[10,0.5]]
y = x[0 < 1]
print (y)
它将准确返回 x 是什么(因为零IS小于一)。
假设这是一种编写 if-conditional 语句的方法,我发现它真的很荒谬,因为我正在将一个数组与一个整数进行比较。
谢谢您的回答!
答案 0 :(得分:2)
脾气暴躁:
[1,1,2,3,4] <2
(大致)等同于:
[x <2对于[1,1,2,3,4]中的x]
用于香草Python列表。因此,在两种情况下,结果都是:
[真,真,假,假,假]
其他一些函数也是如此,例如加法,乘法等。广播实际上是Numpy的主要卖点。
现在,您可以在Numpy中执行的另一件事是布尔索引,该索引提供了一系列布尔值,这些布尔值被解释为“是否保持此值Y / N?”。所以:
arr = [1,1,2,3,4]
res = arr[arr<2]
# evaluates to:
=> [1,1]
答案 1 :(得分:0)
numpy
在使用boolean
或int
分割数组时的工作原理有所不同。
来自docs:
当obj是布尔类型的数组对象时(例如,可能从比较运算符返回),将发生这种高级索引。一个 布尔索引数组实际上与x [obj.nonzero()]相同 如上所述,其中obj.nonzero()返回一个元组(长度为 显示obj的True元素的整数索引数组的obj.ndim)。 但是,当obj.shape == x.shape时,速度更快。
如果obj.ndim == x.ndim,则x [obj]返回填充的一维数组 x的元素对应于obj的True值。的 搜索顺序将是行优先的C样式。如果obj在以下位置具有True值 超出x范围的条目,则索引错误将 被提高。如果obj小于x,则等同于用填充 错误的。
使用布尔值对数组建立索引时,您正在告诉numpy
选择与True
相对应的数据,因此array[True]
与array[1]
不同。因此,在第一种情况下,numpy
会将其解释为零维布尔数组,根据掩码的工作原理,该数组与选择所有数据相同。
因此:
x[True]
将返回完整数组,就像
x[False]
将返回一个空数组。