2014-12-04 29 views
0

我有一個numpy的陣列DAT保持X/Y其中繪製以後值:numpy的數據點區域/圈

[ 
    [1 2 3 4 5] 
    [2 4 6 8 10] 
] 

DAT [0]保持x值, DAT 1包含相應的y-alues。

現在我想知道哪些數據點具有特定範圍(例如5), 中的鄰居,所以我做了以下例如。爲0點(X = 1,Y = 2):

numpy.where(
    (dat[0] > dat[0][0] - 5) 
    & 
    (dat[0] < dat[0][0] + 5) 
    & 
    (dat[1] > dat[1][0] - 5) 
    & 
    (dat[1] < dat[1][0] + 5) 
) 

這工作,但在指定的範圍/區域是10×10大小的平方,我想有 一個圓。

我的下一個嘗試是過濾數據與點之間的矢量(其中矢量長度必須小於5),它可以很好地處理兩點,但我無法弄清楚正確的numpy.where語句。

兩點很簡單:

math.sqrt((x_p1 - x_p2)**2 + (y_p1 - y_p2)**2) < 5 

但如何相當於numpy.where會是什麼樣子? 我想在整個陣列上執行此操作,而不是一次又一次地只執行兩個點。

爲了形象,希望澄清問題

enter image description here

P1是一個點出我的數據,我想所有的綠色點,這是在5半徑的圓圈,應該過濾紅點。

上述解決方案的矢量長度只能實現這兩點,我希望這個工作在整個數組,以便我可以for-loop與numpy.where獲取所有鄰居< 5爲每個點陣列。

+0

我認爲你應該查看更多[numpy的布爾索引](http://docs.scipy.org/doc/numpy/user/basics.indexing.html),而不是使用'np.where'。也許[pandas-finding-points-within-maximum-distance](https://stackoverflow.com/questions/26825710/pandas-finding-points-within-maximum-distance/26871198#26871198)也是有幫助的。 – 2014-12-04 19:58:52

+0

另請參閱numpy如何與數組進行數學運算 - 那些x和y點可以是數組(使用'np.sqrt'而不是'math.sqrt'!)。另外請注意,python列表和numpy數組並不是一回事。 – Ajean 2014-12-04 20:57:40

回答

1

您可以用複數做到這一點,利用abs,然後一個for循環和廣播:

a=np.array([1,2,3,4,5]) 
b=np.array([6,7,8,9,10]) 
c=[np.complex(x,y) for x,y in zip(a,b)] 

for x in c: 
    c[np.abs(c-x)<5] 

或者,如果你想要的座標,而不是值:

for x in c: 
    np.where(np.abs(c-x)<5)