对于一些矩形,我们可以非常高效地选择2D数组中的所有索引:
arr[y:y+height, x:x+width]
...其中(x, y)
是矩形的左上角,height
和width
则分别代表矩形选择区域的行数和列数。
现在,假设我们想要选择位于某个圆内的二维数组中的所有索引,给定圆心坐标(cx, cy)
和半径r
。是否有一种numpy函数可以高效地实现这个目标?
目前,我正在通过手动Python循环计算索引,将索引添加到缓冲区(列表)中来预先计算。因此,对于大型2D数组而言,这相当低效,因为我需要将位于某个圆内的每个整数都放入队列中。
# buffer for x & y indices
indices_x = list()
indices_y = list()
# lower and upper index range
x_lower, x_upper = int(max(cx-r, 0)), int(min(cx+r, arr.shape[1]-1))
y_lower, y_upper = int(max(cy-r, 0)), int(min(cy+r, arr.shape[0]-1))
range_x = range(x_lower, x_upper)
range_y = range(y_lower, y_upper)
# loop over all indices
for y, x in product(range_y, range_x):
# check if point lies within radius r
if (x-cx)**2 + (y-cy)**2 < r**2:
indices_y.append(y)
indices_x.append(x)
# circle indexing
arr[(indices_y, indices_x)]
如前所述,对于较大的数组/圆形,这种方法效率会变得相当低下。有没有加速的好方法?
如果有更好的索引圆形的方式,那么是否也适用于“任意”的2D形状?例如,我是否可以通过传递一个表示任意形状点成员资格的函数来获取数组相应的numpy索引?