2015-06-21 81 views
2

之間找到索引我想找到dataXdataY這是邊界(B4X1,B4X2)之間的所有元素和(B4Y1,B4Y2)落在給定範圍

import numpy as np 

B4X1 = 50. 
B4X2 = 60. 


B4Y1 = 150. 
B4Y2 = 160. 

dataX = np.array([40, 25, 50, 60, 55]) 
dataY = np.array([140, 125, 150, 160, 155]) 

Expected result is: 

result = array([False, False, False, False, True], dtype=bool) 

怎麼會做的更快的方法它?

我一樣:

OK = (B4X1 < dataX < B4X2) & (B4Y1 < dataY < B4Y2) 

print OK 

但錯誤:

Traceback (most recent call last): 
    File "C:\Users\je\Desktop\test.py", line 14, in <module> 
    OK = (B4X1 < dataX < B4X2) & (B4Y1 < dataY < B4Y2) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

回答

2

的快捷符號B4X1 < dataX < B4X2不起作用。

你需要做到以下幾點:

OK = (B4X1 < dataX) & (dataX < B4X2) & (B4Y1 < dataY) & (dataY < B4Y2) 

編輯:

由於時間被帶到了:

In [23]: dataX = np.random.randint(200, size=100) 

In [24]: dataY = np.random.randint(200, size=100) 

In [25]: %timeit OK = (B4X1 < dataX) & (dataX < B4X2) & (B4Y1 < dataY) & (dataY < B4Y2) 
10000 loops, best of 3: 23.6 µs per loop 

In [26]: %timeit OK = np.logical_and.reduce([B4X1<dataX,dataX<B4X2,B4Y1<dataY,dataY<B4Y2]) 
10000 loops, best of 3: 26.7 µs per loop 

In [27]: %timeit for i in dataX: OK = (B4X1 < i and i < B4X2) and (B4Y1 < i and i < B4Y2) 
1000 loops, best of 3: 449 µs per loop 

In [28]: %timeit for i in dataX: OK = (B4X1 < i and i < B4X2) and (B4Y1 < i and i < B4Y2) 
1000 loops, best of 3: 329 µs per loop 
+0

這是否真的是這樣做的最佳方式?它會比應該要求的高2N以上。 – user3467349

+0

@ user3467349我確定有一個更快的方法,但這種方法通常足夠快,您不必擔心條紋等。 Numpy在這方面寫得很好。此外,如果你寫的東西給出了一個錯誤,那麼它的速度有多快並不重要。 –

+0

@ user3467349既然你提出了比較,你也應該提出分支,這可能比簡單地執行'和'操作更昂貴。查看我上面提供的時間信息。另外,請記住,numpy在本地代碼中執行內部循環,而不是在python中執行,所以「長途」在這裏實際上效率更高。 –

1

既然你想在所有的條件應用logical_and操作作爲一種可以使用的優雅方式np.logical_and.reduce

>>> np.logical_and.reduce([B4X1<dataX,dataX<B4X2,B4Y1<dataY,dataY<B4Y2]) 
array([False, False, False, False, True], dtype=bool)