import numba as nb
# short-circuiting replacement for np.any()
@nb.jit(nopython=True)
def sc_any(array):
for x in array.flat:
if x:
return True
return False
# short-circuiting replacement for np.all()
@nb.jit(nopython=True)
def sc_all(array):
for x in array.flat:
if not x:
return False
return True
8条答案
按热度按时间3xiyfsfu1#
这里发布的其他答案也可以,但要使用的最清晰、最有效的函数是
numpy.any()
:或
numpy.all(a==0)
更好,因为它使用更少的RAM(它不需要由a==0
项创建的临时数组)。numpy.count_nonzero(a)
更快,因为它可以在找到第一个非零元素时立即返回。***编辑:**正如@Rachel在评论中指出的那样,
np.any()
不再使用“短路”逻辑,因此您不会看到小型阵列的速度优势。qlzsbp2j2#
查看numpy.count_nonzero。
fjnneemd3#
我会在这里使用np.all,如果你有一个数组a:
fafcakar4#
正如另一个答案所说,如果你知道
0
是数组中唯一可能的false元素,那么你可以利用truthy/falsy评估。数组中的所有元素都是false,如果其中没有任何true元素。*然而,答案声称
any
比其他选项更快,部分原因是短路。截至2018年,Numpy的all
和any
不会短路。如果你经常做这类事情,那么很容易使用
numba
制作自己的短路版本:即使在不短路的情况下,这些版本往往比Numpy的版本更快。
count_nonzero
是最慢的。用于检查性能的一些输入:
检查:
all
和any
等价关系:fhg3lkii5#
这会有用的。
tpgth1q76#
如果数组中的所有元素都大于或等于0,我认为使用sum是最快的方法。
cbeh67ev7#
如果你想把1 e-15分类为零:
nx7onnlm8#
如果你正在测试所有的零,以避免在另一个numpy函数上出现警告,那么在try,except块中 Package 这一行将保存在你感兴趣的操作之前进行零测试的时间。