【发布时间】:2013-03-28 18:13:46
【问题描述】:
我很好奇使用 numpy ufuncs 与内置运算符与内置运算符的“函数”版本的好处和权衡。
我对所有 ufunc 都很好奇。也许有时候有些比其他的更有用。不过,为了简单起见,我将在示例中使用<。
有几种方法可以通过单个数字“过滤”一个 numpy 数组以获得一个布尔数组。每种形式都给出相同的结果,但是否有首选的时间/地点来使用其中的一种?这个例子我将一个数组与一个数字进行比较,所以所有 3 都可以工作。
考虑使用以下数组的所有示例:
>>> x = numpy.arange(0, 10000)
>>> x
array([ 0, 1, 2, ..., 9997, 9998, 9999])
'
>>> x < 5000
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit x < 5000
100000 loops, best of 3: 15.3 us per loop
operator.lt
>>> import operator
>>> operator.lt(x, 5000)
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit operator.lt(x, 5000)
100000 loops, best of 3: 15.3 us per loop
numpy.less
>>> numpy.less(x, 5000)
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit numpy.less(x, 5000)
100000 loops, best of 3: 15 us per loop
>>> x < 5000
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit x < 5000
100000 loops, best of 3: 15.3 us per loop
>>> import operator
>>> operator.lt(x, 5000)
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit operator.lt(x, 5000)
100000 loops, best of 3: 15.3 us per loop
>>> numpy.less(x, 5000)
array([ True, True, True, ..., False, False, False], dtype=bool)
>>> %timeit numpy.less(x, 5000)
100000 loops, best of 3: 15 us per loop
请注意,它们都实现了几乎相同的性能和完全相同的结果。我猜所有这些调用实际上最终都在同一个函数中,因为< 和operator.lt 都映射到一个numpy 数组上的__lt__,这可能是使用numpy.less 或等效的实现的?
那么,哪个更“惯用”和“首选”?
【问题讨论】: