多帧numpy数组按不同坐标切片赋值报错:TypeError索引问题
解决numpy多帧按不同坐标切片赋值的报错问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: only integer scalar arrays can be converted to a scalar index,本质原因是numpy的切片语法(start:end)只认单个整数标量当起始/结束值,但你这里传的slice_yyxx[:,0]是个长度为5的数组(对应每帧的y1),切片没法同时处理每帧不同的范围——毕竟切片是给整个维度设置统一的区间,而你需要给每帧单独划不同的区域,自然就报错了。
两种可行的解决方案
方法1:循环遍历(简单直观,小数据首选)
既然每帧的切片范围都是独立的,直接循环每帧逐个赋值就好,代码一看就懂,对于5帧这种小体量完全够用:
for i in range(nbr_frame): y1, y2, x1, x2 = slice_yyxx[i] multiple_frames[i, y1:y2, x1:x2] = 1
方法2:向量化索引(高效处理大规模数据)
如果你的帧数特别多,不想用循环拖慢速度,可以用向量化的方式生成所有需要赋值的坐标点,一次性完成操作:
# 生成每个切片对应的帧索引,重复对应切片的高度次数 frame_idx = np.concatenate([np.full(y2 - y1, i) for i, (y1, y2, _, _) in enumerate(slice_yyxx)]) # 生成所有切片内的y坐标 y_idx = np.concatenate([np.arange(y1, y2) for y1, y2 in slice_yyxx[:, :2]]) # 生成所有切片内的x坐标,每个y对应的x范围重复y的次数 x_idx = np.concatenate([np.tile(np.arange(x1, x2), y2 - y1) for y1, y2, x1, x2 in slice_yyxx]) # 一次性赋值 multiple_frames[frame_idx, y_idx, x_idx] = 1
这种方式通过预先计算所有要赋值的位置索引,避免了循环开销,适合处理成百上千帧的大数据场景。
不管用哪种方法,最终都能实现你想要的效果:给每帧对应的[y1,y2,x1,x2]区域全部赋值为1~
内容的提问来源于stack exchange,提问作者Timothée Dautrême
相关产品推荐
相关产品推荐

