简单的问题:我知道像
这样的东西import numpy as np
a = np.array([1, 2])
(a < 2)
将返回一个布尔数组,其中检查条件(elem <2):
array([True, False], dtype=bool)
这是一种原生的numpy方法吗?我搜索了这个文档,但无法找到任何:(
有人可以提供文档链接吗?
像(a < 2).sum()
这样的东西被认为是“好的风格”,用于计算满足某种条件的元素数量吗?
...最后:有没有更快的方法根据条件将数组转换为布尔数组?或者这是否已经成为根据条件检查每个元素的有效方法?
答案 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+1
和a<2
等表达式会被转换为调用a.__add__(1)
,a.__lt__(2)
。反过来,这些函数是从编译的代码创建的。 numpy源代码可在github
上找到,但不容易理解。
也许最相关的doc部分是
(尽管大多只是列出了数组方法和句法表达式之间的等价,就像我一样。)
答案 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)
更快更自然。