python - 如何将切片对象转换为 bool 索引?

标签 python numpy

TL;博士:

了解NUM_ROWS的值(value), rminrmax ,如何构造一个 bool 数组 my_idx这样np.arange(NUM_ROWS)[my_idx] == np.arange(NUM_ROWS)[rmin:rmax] ?施工作业是否可以广播,如果rminrmax是数组广告我对所有切片都感兴趣 [slice(from, to) for from, to in zip(rmin, rmax)]


包含详细信息的长版本

我在 2D 图像中有一个多边形数组,我想查找图像中不包含多边形的行和列。为了快速做到这一点,我尝试尽可能地矢量化代码。

我计算每个多边形在两个维度上的极值点,并为每个多边形获得 min_row , min_col , max_rowmax_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/

相关文章:

python - 转换为二进制会截断位

python - 将嵌套列表的字典转换为元组列表

python numpy,按行和列对矩阵进行排序

python - 将 Pandas 系列输出到txt文件

python - 使用 fmin_slsqp 构造最小二乘函数

python - 如何创建除一组给定值之外的随机序列

python - Django:启动时重定向到 Web 应用程序

python - 从不同的文件运行单元测试

python - 运行多个 python 程序时的高内核 CPU

python - 使用 Scippy 的 ndimage.map_coordinates 进行插值时出现意外结果