Python 应用np.where对方括号过滤进行numpy过滤

Python 应用np.where对方括号过滤进行numpy过滤,python,arrays,performance,numpy,indexing,Python,Arrays,Performance,Numpy,Indexing,我可以通过 a[np.where(a[:,0]==some_expression)] 或 这些版本的(dis)优势是什么?特别是在性能方面?令我惊讶的是,第一个版本的性能似乎稍好一些: a = np.random.random_integers(100, size=(1000,1)) import timeit repeat = 3 numbers = 1000 def time(statement, _setup=None): print(min( timeit.Timer

我可以通过

a[np.where(a[:,0]==some_expression)]


这些版本的(dis)优势是什么?特别是在性能方面?

令我惊讶的是,第一个版本的性能似乎稍好一些:

a = np.random.random_integers(100, size=(1000,1))

import timeit

repeat = 3
numbers = 1000

def time(statement, _setup=None):
  print(min(
    timeit.Timer(statement, setup=_setup or setup).repeat(repeat, numbers)))

setup = """from __main__ import np, a"""

time('a[np.where(a[:,0]==99)]')
time('a[(a[:,0]==99)]')
印刷品(例如):


增加数组的大小会使数字差异更大

布尔索引在内部转换为整数索引。这是:

通常,如果索引包含布尔数组,则结果将为 与将
obj.nonzero()
使用上面描述的整数数组索引机制

因此,这两种方法的复杂性是相同的。但是
np。其中
对于大型阵列更有效:

np.random.seed(0)
a = np.random.randint(0, 10, (10**7, 1))
%timeit a[np.where(a[:, 0] == 5)]  # 50.1 ms per loop
%timeit a[a[:, 0] == 5]            # 62.6 ms per loop

现在
np.where
还有其他好处:高级整数索引在多个维度上都能很好地工作。有关布尔索引在这方面不直观的示例,请参阅。因为
np.where
比布尔索引更有效,这只是一个额外的理由,它应该是首选的。

在我看来,np.where的主要优点是,当表达式为false时,它也可以给出结果。这是我使用它的主要方式。您还可以检查它是如何影响性能的,尤其是运行时。@LiorT-我不确定我是否理解您的评论,您的意思是如果
a[:,0]==某个表达式
都为False
a[a[:,0]==某个表达式]
在这种情况下也起作用case@Mr_and_Mrs_Dnp.where有点像excel的if函数。您可以要求它为某些条件为真的位置提供一个答案,如果不为真,则提供另一个值。例如np,其中(x==10,10,0)将返回一个10的数组,零取决于x是否等于10。我明白了,这有时是有用的,但在这个问题上,这不应该是相关的,而是np.where()文档说:“如果只给出条件,则返回条件.nonzero()。为什么这与默认的布尔索引不同,因为两者都使用bool_array.nonzero()?@Dusch,不确定,我还没有看过源代码。可能是一个实现细节。我的基本观点是
np。其中
速度更快,用途更广,因此,如果效率很重要,那么长篇大论是值得的。
0.017856399000000023
0.019185326999999974
np.random.seed(0)
a = np.random.randint(0, 10, (10**7, 1))
%timeit a[np.where(a[:, 0] == 5)]  # 50.1 ms per loop
%timeit a[a[:, 0] == 5]            # 62.6 ms per loop