2017-06-07 65 views

回答

3

對於一維數組它的工作原理,因爲內置Python- any - 功能只需要一個迭代與可轉換爲bool S(和一維數組滿足這些條件)的項目,但對於多維數組它將不起作用:

>>> import numpy as np 

>>> any(np.ones((10, 10))) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

>>> np.any(np.ones((10, 10))) 
True 

這是因爲,如果我們通過遍歷數組你遍歷第一維,如果你有一個多維數組,你會得到在每一次迭代的array(非數字)。這些array s不能投射到bool s。所以它拋出異常。

np.any將在陣列比any更快(在大多數情況下),因爲它意識到了輸入型(array)的,它可避免蟒蛇迭代是any需求:

In [0]: arr = np.zeros((1000)) 

In [1]: %timeit any(arr)  
Out[1]: 215 µs ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [2]: %timeit np.any(arr) 
Out[2]: 31.2 µs ± 1.41 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

作爲一個方面說明,你可能想使用any(np.zeros(4) > 0)而不是any(np.zeros(4))>0

第一個檢查如果陣列中的任何元素大於零,如果第二檢查any的結果(如果True任何元件是零)是零以上時。

+0

很好的解釋和時間的例子。你確定這個附註嗎? 'any(np.zeros(4)).__ eq __(0)'==>'True','any(np.zeros(4)).__ lt __(0)'==>'False'等等,與「檢查任何元素是否等於/ above/... zero」大致相同。 – salient

+1

比較和算術運算符像'>'在數組上執行元素操作/檢查,所以我非常確定。除了你想檢查'any'的結果是否大於'0'。例如'any(np.array([ - 1,0,0]))> 0'返回'True',但是'any(np.array([ - 1,0,0])> 0)'返回'False '。這取決於你需要什麼(而你沒有說過)所以也許這是我的錯誤。 :) – MSeifert

+0

啊現在看到了區別:) – salient

2

A numpy數組是可迭代的,這是所有內置的any期望的參數。如果iterable的所有元素都是falsey,則所有的零都是false,則any返回False。那麼比較False > 0也是False,給你觀察值。

相關問題