2017-09-25 36 views
0

我有以下ndarray:如何根據兩個where子句訪問2d數組的元素?

[[ 3 271] 
[ 4 271] 
[375 271] 
[ 3 216] 
[375 216] 
[ 0 0] 
[ 0 546] 
[378 546] 
[378 0] 
[ 1 182] 
[ 2 181] 
[376 181] 
[377 182] 
[377 544] 
[376 545]] 

本質上一堆的X,Y座標/分。我希望能夠選擇兩個軸上給定點附近的X,Y座標。例如,給定目標點[3,271],我首先在此Y位置(271)檢索所有其他點,然後可以選擇X軸上的行 -/+ 3。針對上述情況,應該產生:

index_on_y = points[:,1] == point[1] 
shared_y = points[index_on_y] 

這將返回:

[ 3 271] 
[ 4 271] 

我儘量讓具有相同Y值這樣所有的行得到

shared_y: 
[[ 3 271] 
[ 4 271] 
[375 271]] 

現在如何選擇這個數組中的所有行,X值(列0)可以是0-6之間的任何值?我已經嘗試了切片/索引/ np.where的各種組合,但是我一直無法獲得所需的結果。下面是我得到的,但我知道這是不正確的;只是不知道正確的東西(和最有效的),這樣做將是這樣:

def nearby_contour_points_x(self, point, points, radius): 
    index_on_y = points[:,1] == point[1] # correct 
    shared_y = points[index_on_y] # correct 
    x_vals = shared_y[:,0] # not good? 

    index_on_x = np.where(np.logical_or(x_vals <= (point[0] - radius), x_vals <= (point[0] + radius))) 
    return shared_y[index_on_x] 

理想情況下,我就不會去第一組的軸線之一。

回答

1

a作爲您的示例中的數組。

target = np.array([3, 271]) 

減去目標

diff = a - target 

Ý(列酮)必須是一樣的目標 - 這導致形狀a.shape [0]的數組布爾:

y_rows = diff[:,1] == 0 

x在目標的範圍內 - 這會產生一個形狀爲a.shape [0]的布爾數組:

x_rows = np.logical_and(diff[:,0] <= 6, diff[:,0] >= 0) 

作出boolean indexing掩模 - 其形狀將是(15) - a.shape [0], 它允許broadcast沿着行

mask = np.logical_and(x_rows, y_rows) 

>>> a[mask] 
array([[ 3, 271], 
     [ 4, 271]]) 

上述,初始減法和更廣泛一點:

x_rows = np.logical_and(a[:,0] >= target[0] - 3, a[:,0] <= target[0] + 3) 
y_rows = a[:,1] == target[1] 
mask = np.logical_and(x_rows, y_rows) 
+0

謝謝!最終的結果給了我想要的,但它也包含了目標值本身。這並不是一個真正的問題,假設「本身」將始終是返回數組中的第一個值。 – Tom

0

也許濫用isclose但作品

ys = np.array([[ 3, 271], 
[ 4, 271], 
[375, 271]]) 

np.compress(np.all(np.isclose(ys, [3,271], rtol=0, atol=3), axis=1), ys, axis=0) 
Out[273]: 
array([[ 3, 271], 
     [ 4, 271]]) 
+0

我打算使用'isclose',但決定先以另一種方式工作。 – wwii