Numpy:条件检查后返回布尔数组

时间:2015-10-28 00:39:15

标签: python arrays numpy boolean conditional-statements

简单的问题:我知道像

这样的东西
import numpy as np

a = np.array([1, 2])
(a < 2)

将返回一个布尔数组,其中检查条件(elem <2):

array([True, False], dtype=bool)

这是一种原生的numpy方法吗?我搜索了这个文档,但无法找到任何:(

有人可以提供文档链接吗?

(a < 2).sum()这样的东西被认为是“好的风格”,用于计算满足某种条件的元素数量吗?

...最后:有没有更快的方法根据条件将数组转换为布尔数组?或者这是否已经成为根据条件检查每个元素的有效方法?

2 个答案:

答案 0 :(得分:1)

我不明白为什么你会关注速度或更好的方式。

想想补充:

a + 1

1添加到a的每个元素,对吗?为什么不以相同的方式执行条件测试 - 测试每个元素。

这类似于列表理解,只在更快的编译代码中完成

[i+1 for i in a]
[i<2 for i in a]

(a < 2).sum()有效,因为True/False的处理方式与1/0相同。它也必须迭代布尔值的所有元素,将它们相加。

在语法上,a+1a<2等表达式会被转换为调用a.__add__(1)a.__lt__(2)。反过来,这些函数是从编译的代码创建的。 numpy源代码可在github上找到,但不容易理解。

也许最相关的doc部分是

http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html#arithmetic-matrix-multiplication-and-comparison-operations

(尽管大多只是列出了数组方法和句法表达式之间的等价,就像我一样。)

答案 1 :(得分:1)

是的,它是原生的。

In [5]: a=random(1e7)

In [6]: %timeit  a < .5 
10 loops, best of 3: 33.1 ms per loop

In [8]: 33e-3/len(a)
Out[8]: 3.3e-09

这表明每次比较花费大约3 ns,这对于python int来说是不可能的。

对于计数,count_nonzero(a<2)更快更自然。