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]==某个表达式
都为Falsea[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