RerunTensorWidthDimension组件详解:张量宽度维度的选择、编码与查看器自动校验
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
TensorWidthDimension是 Rerun 数据类型系统中用于指定「将张量(Tensor)的哪一个维度映射为宽度」的蓝图组件。它是TensorSliceSelection(张量二维切片选择)蓝图原型的关键组成之一,配合TensorHeightDimension、TensorDimensionIndexSelection与滑块组件,共同决定 Tensor 视图(re_view_tensor)中如何从 N 维张量中切出可视化的 2D 切片。阅读本文后,你将掌握该组件的字段语义、底层编码(TensorDimensionSelection)、Arrow 序列化格式,以及查看器端如何对越界维度进行钳制与自动回退,并能在 Python / Rust / C++ SDK 中正确使用它。
组件定位:从 N 维张量到 2D 视图
Rerun 的 Tensor 视图负责可视化 N 维张量数据。为了把高维数据展示在屏幕上,查看器必须先把张量「切」成一个 2D 切片——其中一个维度映射到宽度(width),一个维度映射到高度(height),其余维度通过索引或滑块固定取值。
TensorWidthDimension正是承担「指定宽度维度」这一职责的组件。在类型定义文件中,它与高度组件成对出现:
// crates/build/re_type_definitions/rerun/components/tensor_dimension_selection.def.rs /// Specifies which dimension to use for height. #[rerun(state = "stable")] pub struct TensorHeightDimension { pub dimension: rerun::encodings::TensorDimensionSelection, } /// Specifies which dimension to use for width. #[rerun(state = "stable")] pub struct TensorWidthDimension { pub dimension: rerun::encodings::TensorDimensionSelection, }两个组件结构完全一致,仅语义不同,均被标记为stable稳定状态,并作为TensorSliceSelection蓝图原型的可选字段(Option)存在——也就是说,宽度维度可以不显式指定,交由查看器自动推断(详见下文「自动校验与回退」)。
字段语义:dimension与invert
TensorWidthDimension本身没有自有字段,它直接委托给底层编码TensorDimensionSelection。在 TensorDimensionSelection 编码文档 中,该结构包含两个字段:
| 字段 | 类型 | 语义 |
|---|---|---|
dimension | 非空UInt32 | 要选择的维度编号(从 0 开始的轴索引) |
invert | 非空Boolean | 是否反转该维度的方向 |
其中dimension是核心:它指明张量的第几个轴(axis)映射为宽度。invert用于坐标轴方向校正——例如相机坐标系中图像行方向通常向下,而在某些可视化约定中宽度方向需要与「左/右」对齐,此时置invert = true可反转该轴的方向。
类型定义源文件 tensor_dimension_selection.def.rs 还给出了一个直观的注释示例:dimension=2、index=42的选择,等价于 NumPy 中的tensor[:, :, 42, :, :, …]——这正是同族组件TensorDimensionIndexSelection的用法,而宽度/高度组件只关心维度号本身。
Rerun 编码:TensorDimensionSelection
TensorWidthDimension是「组件(Component)」,其数据载体是「编码(Encoding)」TensorDimensionSelection。在 Rust 侧,组件通过WrapperComponent包装编码:
// crates/store/re_sdk_types/src/components/tensor_width_dimension.rs #[derive(Clone, Debug, Hash, Copy, PartialEq, Eq, Default, ::re_byte_size::SizeBytes)] #[repr(transparent)] pub struct TensorWidthDimension(pub crate::encodings::TensorDimensionSelection); impl ::re_types_core::WrapperComponent for TensorWidthDimension { type Encoding = crate::encodings::TensorDimensionSelection; fn name() -> ComponentType { "rerun.components.TensorWidthDimension".into() } // ... }该文件头部注释明确说明它由re_types_builder代码生成器自动生成,源头正是前文引用的.def.rs类型定义。组件名称为rerun.components.TensorWidthDimension,是 Rerun 协议中的正式标识。
为了方便使用,SDK 提供了便捷构造:
Rust:
From<u32>允许直接用整数构造,invert自动取false(见 tensor_dimension_selection_ext.rs):impl From<u32> for TensorDimensionSelection { fn from(dimension: u32) -> Self { Self { dimension, invert: false } } }因此在 Rust 中
TensorWidthDimension::from(0)即表示「第 0 维作为宽度、不反转」。Python:类型定义中标注了
#[python(aliases = "int")]与#[python(array_aliases = "npt.ArrayLike")],意味着 Python API 允许直接传整数(或 NumPy 数组)来构造,例如rr.components.TensorWidthDimension(dimension=0)或直接传0。C++:与 Rust / Python 一样由同一份
.def.rs经re_types_builder生成对应绑定。
Arrow 数据类型与序列化
TensorWidthDimension在 Rerun 存储层以 Arrow 格式序列化。其 Arrow 数据类型是一个结构体(Struct):
Struct( "dimension": non-null UInt32 "invert": non-null Boolean )这个布局在编码的 Rust 实现 tensor_dimension_selection.rs 中可逐行印证:arrow_data_type()返回DataType::Struct(Fields::from(vec![Field::new("dimension", DataType::UInt32, false), Field::new("invert", DataType::Boolean, false)])),ToArrow序列化时分别生成UInt32Array与BooleanArray两个子列并打包进StructArray;FromArrow反序列化时则按字段名查找子数组,缺失任一字段都会报missing_struct_field错误。两个字段均非空(non-null),反序列化时还会通过err_on_nulls拒绝空值,保证数据完整性。
在TensorSliceSelection蓝图原型中的角色
TensorWidthDimension不是独立使用的组件,而是TensorSliceSelection蓝图原型的组成部分。在类型定义 tensor_slice_selection.def.rs 中,该原型(状态为unstable,作用域为blueprint)包含四个可选字段:
width: Option<TensorWidthDimension>——哪个维度映射到宽度;未指定时根据维度名称与索引自动推断;height: Option<TensorHeightDimension>——哪个维度映射到高度;indices: Option<Vec<TensorDimensionIndexSelection>>——其余各维选定的索引;若与width/height重复则被忽略;slider——需要出现索引滑块的维度列表,滑块编辑会直接写回indices。
也就是说,想要在 Python 中为 Tensor 视图指定宽度维度,通常是构建/修改TensorSliceSelection蓝图原型,设置其中的width字段(类型即TensorWidthDimension),而非单独记录该组件。该组件在数据模型中本身是「组件」,蓝图原型则把它与高度、索引、滑块组织成一个完整的 2D 切片描述。
查看器端的自动校验与回退
视图端(re_view_tensorcrate)在加载蓝图切片选择时会进行「清洗(scrubbing)」以保证选择对当前张量形状有效。核心逻辑位于 dimension_mapping.rs 的TensorSliceSelection::load_and_make_valid,其通用规则为:
- 越界钳制:
dimension超过张量有效轴范围时,被钳制到shape.len() - 1(最大有效维号); - 宽度/高度冲突处理:若
width.dimension == height.dimension,则移除高度(height.take()),视作未设置; - 自动回退:当张量至少有 2 个维度时,强制宽度与高度都存在;若缺失则调用
find_width_height_dim_indices依据维度名称推断——宽度默认取名为left的轴(若名称匹配left还会自动设置invert = true),高度默认取名为up的轴,并相应设置invert。
这段逻辑直接印证了invert字段的实际用途:它服务于「方向」语义——当宽度维度恰好是名为left的轴时,查看器会自动反转其方向,使可视化坐标系与张量存储方向正确对齐。用户显式设置的TensorWidthDimension同样经过这套钳制与去重流程,保证最终切片选择对任意形状的张量都有效。
跨语言 API 速览
三种官方 SDK 均提供TensorWidthDimension组件,其 Python 侧生成代码见 tensor_width_dimension.py:TensorWidthDimension直接继承encodings.TensorDimensionSelection并混入ComponentMixin,配合TensorWidthDimensionBatch以批量方式参与日志/蓝图序列化。典型用法模式:
- Python:
rr.blueprint.archetypes.TensorSliceSelection(width=rr.components.TensorWidthDimension(dimension=0)),dimension与invert均可直接传参; - Rust:
TensorSliceSelection::new().with_width(TensorWidthDimension::from(0))(From<u32>让整数直接可用); - C++:与上述两语言同一套命名与字段约定(
rerun::components::TensorWidthDimension)。
原始参考文档 tensor_width_dimension.md 末尾为各语言提供了对应的 API 文档入口,分别指向 C++(stable 分支头文件文档)、Python(rerun.components.TensorWidthDimension)与 Rust(rerun::components::TensorWidthDimension)的组件说明页,便于按语言查阅更细的构造与使用示例。
小结
TensorWidthDimension是 Rerun Tensor 可视化链路中一个「小而关键」的组件:它以TensorDimensionSelection(dimension: u32+invert: bool)为编码,以非空 Struct 形式的 Arrow 数据类型存储,隶属于TensorSliceSelection蓝图原型,并配合查看器端的钳制、去重与基于维度名称的自动回退逻辑,让开发者只需极少的显式配置即可获得正确的张量切片视图。理解它的字段语义与底层实现,有助于在自定义 Tensor 可视化流程中精准控制切片映射行为。
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考