You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向量化实现图像中指定子矩形区域的赋值循环?

问题:向量化替代循环填充数组区域报错

需求是遍历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

代码说明

  1. cols:生成每个i对应的目标列索引3*i+1;
  2. rows:将每个(Bot[i], Top[i])对应的行范围展开为一维数组,合并所有行索引;
  3. cols_repeated:将每个列索引重复对应行范围的长度(即Top[i]-Bot[i]+1次),确保与行索引的数量匹配;
  4. 最后通过image2[rows, cols_repeated] = value一次性完成所有位置的赋值,完全替代循环逻辑。

内容的提问来源于stack exchange,提问作者Huy Le

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:57:33