【发布时间】:2020-11-19 00:55:01
【问题描述】:
我有两个形状为 (1,169,5,1+4+4) 的多维数组。一个包含数据,另一个包含要填充的零。
>>> preds = np.random.random_integers(0,500,(1,169,5,1+4+4))
>>> filtered_preds = np.zeros((1,169,5,1+4+4))
对于上下文,维度表示以下内容:
- 批量大小
- 网格单元数
- 锚框数量
- 预测(置信度得分、边界框坐标、类数)
我有第三个扁平的形状数组 (169),其中包含最佳锚框的指示
如下所示:
>>> best_bboxes = np.random.random_integers(0,4,(169,))
为了防止使用循环,我的第一反应是尝试以下方法来放置置信度值:
>>> filtered_preds[:,:,best_ab_idx,0:1] = preds[:,:,best_ab_idx,0:1]
但是,在检查数组时,我没有得到不想要的输出,因为 filtered_preds[:,:,best_ab_idx,0:1] 的形状是 (1,169,169,1)
到目前为止,我想我的问题是,如何从我的预测数组中获取具有第二维大小的值并使用第三维的值来获得所需的值?
我对数组索引还是有点陌生,因此我们将不胜感激。
注意:我使用的是 PyTorch,但在 NumPy 中给出了我的示例,因为它遵循相同的原则。
编辑:
这是我尝试使用循环实现的解决方案:
for idx,i in enumerate(best_bboxes):
filtered_preds[:,idx,best_bboxes[idx],0:1] = preds[:,idx,best_bboxes[idx],0:1]
filtered_preds[:,idx,best_bboxes[idx],1:5] = preds[:,idx,best_bboxes[idx],1:5]
filtered_preds[:,idx,best_bboxes[idx],5:] = preds[:,idx,best_bboxes[idx],5:]
【问题讨论】:
-
我运行它时你的最后一个代码块错误。 “IndexError:索引 5 超出轴 2 的范围,大小为 5”
-
已修复!对于那个很抱歉。当我的意思是 4 时,使用 5 作为随机数的最大值。
-
此外,您枚举
best_bboxes很奇怪,但您只使用idx而不是i。我提这个以防万一。 -
你说得对,我可能应该只使用
i来表示锚框索引,我只是倾向于best_bboxes[idx],因为我通常使用过很多 C++。感谢您指出我可以简化的地方。