如何根据两个where子句访问二维数组的元素?

时间:2017-09-25 20:54:57

标签: python numpy multidimensional-array

我有以下ndarray:

[[  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 。对于上述情况,应该产生:

[  3 271]
[  4 271]

我已经得到了所有具有相同Y值的行,如下所示:

index_on_y = points[:,1] == point[1]
shared_y = points[index_on_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]

理想情况下,我不必先在其中一个轴上进行分组。

2 个答案:

答案 0 :(得分:1)

a作为示例中的数组。

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

减去目标

diff = a - target

y (第一列)必须与目标相同 - 这会产生一个形状为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)

答案 1 :(得分: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]])