TL;博士:
了解NUM_ROWS
的值(value), rmin
和rmax
,如何构造一个 bool 数组 my_idx
这样np.arange(NUM_ROWS)[my_idx] == np.arange(NUM_ROWS)[rmin:rmax]
?施工作业是否可以广播,如果rmin
和rmax
是数组广告我对所有切片都感兴趣 [slice(from, to) for from, to in zip(rmin, rmax)]
?
包含详细信息的长版本
我在 2D 图像中有一个多边形数组,我想查找图像中不包含多边形的行和列。为了快速做到这一点,我尝试尽可能地矢量化代码。
我计算每个多边形在两个维度上的极值点,并为每个多边形获得 min_row
, min_col
, max_row
和max_col
值(value)观。让我们只考虑行(对于列,它是相同的算法)并假设,例如,这些是我为两个多边形获得的值:
NUM_ROWS = 10
# Two intervals: slice(1,5) and slice(7,8)
row_mins = np.array([1, 7], dtype=np.int32)
row_maxs = np.array([5, 8], dtype=np.int32)
我现在想以相当于以下方式合并间隔:
row_mask = np.zeros(NUM_ROWS)
for rmin, rmax in zip(row_mins, row_maxs):
row_mask[rmin:rmax] = 1
但是,应该避免for循环和重复设置row_mask中的值。
我想通过将每个范围转换为 bool 数组并使用 np.logical_or.reduce()
来做到这一点,但我找不到生成相当于 [rmin:rmax]
的 bool 数组的方法指数。
有没有办法将切片对象转换为 bool 索引?
最佳答案
编辑:找到正确的方法。
我的观点是正确的。有一种方法可以解压 np.r_
中的切片列表,它就像使用 tuple()
一样简单。这意味着,一旦您将切片映射到 rmin 和 rmax 数组,您只需使用 np.r_
将它们转换为数组,并使用它将掩码的值更新为 1。
import numpy as np
NUM_ROWS = 15
## 3 slices (1:5), (7:10), (12:14)
row_mins = np.array([1, 7, 12])
row_maxs = np.array([5, 10, 14])
mask = np.zeros(NUM_ROWS) #Zeros
slices = list(map(slice,row_mins,row_maxs)) #List of slices
mask[np.r_[tuple(slices)]]=1 #get ranges from list of slices and then update mask
mask
array([0., 1., 1., 1., 1., 0., 0., 1., 1., 1., 0., 0., 1., 1., 0.])
我推荐的旧方法 -
如果您想制作具有多个切片
的 mask ,那么您可以使用np.hstack<无需for循环(矢量化)来实现此操作
和 np.arange
获取所有索引,然后将它们设置为 1。
import numpy as np
NUM_ROWS = 15
## 3 slices (1:5), (7:10), (12:14)
row_mins = np.array([1, 7, 12])
row_maxs = np.array([5, 10, 14])
mask = np.zeros(NUM_ROWS) #Zeros
idx = np.hstack(list(map(np.arange,row_mins,row_maxs))) #Indexes to choose
mask[idx]=1 #Set to 1
mask
array([0., 1., 1., 1., 1., 0., 0., 1., 1., 1., 0., 0., 1., 1., 0.])
编辑:另一种方式 -
您可以使用np.eye()
-
s = slice(1,4)
mask = np.eye(10)[s].sum(0)
print(mask)
[0. 1. 1. 1. 0. 0. 0. 0. 0. 0.]
在切片列表上 -
masks = [np.eye(NUM_ROWS)[slice(i,j)].sum(0) for i,j in zip(row_mins, row_maxs)]
final = np.logical_or.reduce(masks)
final
array([False, True, True, True, True, False, False, True, True,
True, False, False, True, True, False])
关于python - 如何将切片对象转换为 bool 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65739572/