如何向量化实现图像中指定子矩形区域的赋值循环?
问题:向量化替代循环填充数组区域报错
需求是遍历bot和top数组,为每对(bot[i], top[i]),将图像数组第3*i+1列中从bot[i]行到top[i]行的区域填充为255。尝试用向量化代码替代for循环时出现TypeError,原代码及错误信息如下:
import numpy as np import pandas as pd N = 100 image = np.zeros((32, 32)) np.random.seed(42) data = { 'Bot': np.array([2, 5, 3, 1, 7], dtype=np.int32), 'Top': np.array([3, 6, 4, 2, 10], dtype=np.int32) } # 仅能访问df,无法直接访问data df = pd.DataFrame(data) value = 255 # 原循环实现 for i in range(len(data)): image[df.loc[i]['Bot'] : df.loc[i]['Top'] + 1, 3 * i + 1] = value # 尝试向量化但报错的代码 image2 = np.zeros((32, 32)) image2[df['Bot'] : df['Top'] + 1, np.arange(len(df)) * 3 + 1] = value # 此行报错 print(image == image2)
错误信息:
ERROR! Traceback (most recent call last): File "<string>", line 24, in <module> TypeError: slice indices must be integers or None or have an __index__ method
解决方案
错误原因
df['Bot'] : df['Top'] +1这种写法试图用数组作为切片的起始和结束索引,但NumPy的切片要求索引必须是单个整数、None或实现了__index__方法的对象,无法直接接受数组,因此抛出TypeError。
正确向量化实现
要实现向量化赋值,需要生成所有需要填充的行-列坐标对,再一次性对这些位置赋值:
import numpy as np import pandas as pd np.random.seed(42) data = { 'Bot': np.array([2, 5, 3, 1, 7], dtype=np.int32), 'Top': np.array([3, 6, 4, 2, 10], dtype=np.int32) } df = pd.DataFrame(data) value = 255 # 原循环实现 image = np.zeros((32, 32)) for i in range(len(df)): image[df.loc[i]['Bot'] : df.loc[i]['Top'] + 1, 3 * i + 1] = value # 向量化实现 image2 = np.zeros((32, 32)) # 生成每列对应的列索引 cols = np.arange(len(df)) * 3 + 1 # 生成每个列对应的所有需要填充的行索引 rows = np.concatenate([np.arange(bot, top + 1) for bot, top in zip(df['Bot'], df['Top'])]) # 重复列索引,与行索引一一对应 cols_repeated = np.repeat(cols, df['Top'] - df['Bot'] + 1) # 一次性赋值 image2[rows, cols_repeated] = value # 验证结果一致 print((image == image2).all()) # 输出True
代码说明
cols:生成每个i对应的目标列索引3*i+1;rows:将每个(Bot[i], Top[i])对应的行范围展开为一维数组,合并所有行索引;cols_repeated:将每个列索引重复对应行范围的长度(即Top[i]-Bot[i]+1次),确保与行索引的数量匹配;- 最后通过
image2[rows, cols_repeated] = value一次性完成所有位置的赋值,完全替代循环逻辑。
内容的提问来源于stack exchange,提问作者Huy Le
相关产品推荐
相关产品推荐

