我有以下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]
理想情况下,我不必先在其中一个轴上进行分组。
答案 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]])