marimo 交互式矩阵组件mo.ui.matrix完全指南:矩阵/向量编辑、逐元素约束与对称模式
【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo
mo.ui.matrix是 marimo 反应式笔记本内置的可视化矩阵/向量编辑组件,将二维矩阵或一维向量渲染为可逐格拖拽调值的交互式表格,并支持逐元素上下界、步长、禁用掩码、对称联动与科学计数法显示。本文基于 marimo 官方 API 文档(docs/api/inputs/matrix.md)与仓库源码(marimo/_plugins/ui/_impl/matrix.py),完整讲解其参数语义、交互方式、数据校验规则与底层实现,帮助你在笔记本中构建可实时编辑的参数矩阵、变换矩阵或权重向量。
快速上手:一个可交互的单位矩阵
在 marimo 单元格中创建矩阵编辑器只需一行调用。下面的例子构建了一个 3×3 矩阵,初始值为单位矩阵,数值范围限制在[-5, 5],拖动步长为0.1,显示精度为 1 位小数,并配以 LaTeX 标签$I$:
import marimo as mo matrix = mo.ui.matrix( [[1, 0, 0], [0, 1, 0], [0, 0, 1]], min_value=-5, max_value=5, step=0.1, precision=1, label="$I$", ) matrix渲染出来后,每个单元格都是一个"迷你滑杆":点击并水平拖动即可增减该格的值。在另一个单元格中通过matrix.value读取当前编辑结果:
matrix.value # [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]由于 marimo 的反应式数据流,任何对矩阵的编辑都会自动触发下游依赖matrix.value的单元格重新执行,适合用来构建实时可调的线性代数演示、滤波器系数调整面板或动画参数矩阵。
一维向量输入:列向量与扁平返回值
mo.ui.matrix不仅支持二维矩阵,还支持一维(向量)输入。当传入扁平列表时,组件渲染为列向量,且.value返回扁平列表而非嵌套列表:
vector = mo.ui.matrix( [1, 0, 0, 0, 0], min_value=-5, max_value=5, step=0.1, precision=1, label="$\\vec{v}$", ) vectorvector.value # [1.0, 0.0, 0.0, 0.0, 0.0]这一行为在源码中有明确实现:_parse_value检测到首元素不是 list/tuple 时走"1D 路径",内部将扁平列表转换为列向量布局(_1d_to_2d把[a, b, c]变为[[a], [b], [c]]),并在_convert_value中把前端回传的二维值重新展平为一维列表返回给用户(见 marimo/_plugins/ui/_impl/matrix.py)。对应测试test_matrix_1d_column、test_matrix_1d_convert_value验证了这一点(tests/_plugins/ui/_impl/test_matrix.py)。
形状约定总结:
| 输入形式 | 渲染形态 | .value返回 |
|---|---|---|
[[1, 2, 3]] | 行向量 | [[1.0, 2.0, 3.0]] |
[1, 2, 3] | 列向量 | [1.0, 2.0, 3.0] |
[[1, 2], [3, 4]] | 2×2 矩阵 | [[1.0, 2.0], [3.0, 4.0]] |
参数详解
以下是mo.ui.matrix的完整参数表(签名与默认值见 marimo/_plugins/ui/_impl/matrix.py 中的类 docstring):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
value | list[list[Numeric]] \| list[Numeric] \| ArrayLike | 必填 | 初始数据。嵌套列表/二维数组生成矩阵,扁平列表/一维数组生成列向量,行列数由形状推断 |
min_value | Numeric \| list \| ArrayLike \| None | None | 最小值。标量广播到所有单元格;列表或 NumPy 数组可设置逐元素边界;None表示无下界 |
max_value | Numeric \| list \| ArrayLike \| None | None | 最大值,语义同min_value |
step | Numeric \| list \| ArrayLike | 1.0 | 拖动增量。标量广播;列表/数组可设置逐元素步长 |
disabled | bool \| list[list[bool]] \| list[bool] \| ArrayLike | False | 是否禁用编辑。标量广播;列表/布尔数组可设置逐元素禁用掩码 |
symmetric | bool | False | 若为True,编辑[i][j]时同步更新[j][i],要求矩阵为方阵 |
scientific | bool | False | 若为True,以科学计数法显示数值(如1.0e-4) |
precision | int \| None | None | 显示的小数位数;None时根据数据值和步长自动推断 |
row_labels | list[str] \| None | None | 每行的标签 |
column_labels | list[str] \| None | None | 每列的标签 |
debounce | bool | False | 若为True,仅在鼠标松开(pointer release)时才向后端发送值更新,而非每次拖动都发送,适合矩阵驱动昂贵下游计算时使用 |
label | str | "" | 元素的 Markdown/LaTeX 标签 |
所有涉及"值/边界/步长/禁用"的参数都支持三类输入:标量(广播到全部单元格)、嵌套列表(逐元素指定)以及任意类数组对象(只要实现了.tolist(),包括 NumPy 数组、torch Tensor 等)。
逐元素约束:标量广播与数组按位指定
标量参数会被_broadcast展开为rows × cols的完整网格;若传入列表或数组,则按位置逐元素生效。例如设置每格不同上下界:
mat = mo.ui.matrix( [[1, 2], [3, 4]], min_value=[[0, 1], [2, 3]], max_value=[[5, 6], [7, 8]], )一维向量同样支持逐元素约束:
v = mo.ui.matrix( [1, 2, 3], min_value=[0, 1, 2], max_value=[5, 6, 7], step=[0.1, 0.5, 0.25], )禁用指定单元格
disabled=True会锁定整个矩阵;传入布尔网格则只锁定部分单元格。例如只禁用对角线元素:
mat = mo.ui.matrix( [[1, 0], [0, 1]], disabled=[[True, False], [False, True]], )对称模式
symmetric=True时,编辑[i][j]会自动同步更新[j][i],适合编辑协方差矩阵、邻接矩阵等对称结构。注意两点约束:矩阵必须是方阵,且初始数据本身必须是对称的,否则构造时直接抛出ValueError。一维向量输入不支持symmetric。
科学计数法与精度推断
precision=None(默认)时,显示精度由初始数据值与步长共同推断(_infer_precision,上限为 8 位):整数值 + 默认步长 1 会推断出精度 0;浮点步长或浮点数据驱动精度提升。scientific=True时精度按科学计数法的尾数小数位统计(如0.00153显示为1.53e-3需要 2 位尾数精度,而1e-8为 0 位)。这些行为均有测试覆盖(tests/_plugins/ui/_impl/test_matrix.py 中test_matrix_precision_*系列)。
# 科学计数法显示微小幅度的数值 mat = mo.ui.matrix( [[0.001, 1000]], scientific=True, precision=2, )交互操作指南
矩阵组件的交互体验由前端插件实现(frontend/src/plugins/impl/MatrixPlugin.tsx),核心交互包括:
- 拖动调值:在单元格上按住并水平拖动,每移动 10 像素(
PIXELS_PER_STEP)增减一个step;向右增加、向左减少。 - 修饰键加速/减速:按住
Shift拖动时步长放大 10 倍(COARSE_MULTIPLIER),按住Alt/Option时步长缩小为 1/10(FINE_MULTIPLIER),且在拖动过程中切换修饰键会平滑重定基准,不会跳变。 - 键盘操作:单元格获得焦点后,
↑/→增加一个步长,↓/←减少一个步长,PageUp/PageDown以 10 倍步长调整,同样支持Shift/Alt修饰键。 - 精确输入:双击单元格或按
Enter/F2进入编辑态,可直接键入任意数值(包括2.32e7这类科学计数法);键入的数字会被夹取到边界内,但不会吸附到步长上,从而保留精确值。直接键入数字字符也会触发以该字符为起点的编辑。 - 浮点噪声清理:步进计算会经过
cleanFloat处理,消除0.3 - 3 * 0.1这类运算残留(如5.55e-17),同时保留真正微小的步进结果。
前端通过minValue/maxValue的逐元素夹取(clampValue)保证所有编辑路径——拖动、方向键、键入——都无法越界;对称模式下共享值会被夹取到两个单元格边界的交集(withCellValue中的 mirrored 逻辑)。
与 NumPy 及类数组对象无缝集成
value、min_value、max_value、step、disabled均可直接传入 NumPy 数组,底层通过.tolist()归一化处理:
import numpy as np mat = mo.ui.matrix(np.eye(2)) mat读取结果时用np.asarray转回数组便于后续数值计算:
np.asarray(mat.value)示例文件 examples/ui/matrix.py 展示了更多组合用法,包括将矩阵与向量组件用mo.hstack横向并列布局:
mo.hstack( [mo.ui.matrix(np.ones(3)), mo.ui.matrix(np.ones((1, 3)))], justify="start", gap=2, )参数校验与常见报错
组件构造时会对输入做严格校验,非法输入会在创建时(而非运行期)抛出带明确位置的ValueError。以下错误均有对应测试(tests/_plugins/ui/_impl/test_matrix.py):
| 场景 | 报错内容 |
|---|---|
传入空列表[]或空行[[]] | value must be non-empty |
| 传入非列表/非数组对象 | value must be a list of lists or array-like |
| 各行长度不一致(非矩形) | row i has N columns but expected M |
| 3 维及以上嵌套输入 | value must be 2D/must be 2D, but found a nested sequence |
min_value >= max_value | min_value must be less than max_value at [i][j] |
| 初始值越界 | Initial value ... less than min_value / greater than max_value |
step <= 0(含逐元素) | step must be positive |
row_labels/column_labels数量不匹配 | row_labels has N entries but matrix has M rows等 |
symmetric=True但非方阵 | symmetric requires a square matrix |
symmetric=True但初始数据不对称 | initial data is not symmetric: value[i][j] != value[j][i] |
1D 输入配symmetric=True | symmetric is not supported for 1D (vector) input |
| 1D 参数传入二维列表 | must be scalar or 1D, but element i is a list |
负的precision | precision must be a non-negative integer |
总结
mo.ui.matrix将矩阵编辑从"代码改数组"升级为"鼠标拖拽即所得"的交互体验,支持二维矩阵与一维向量两种形态、逐元素边界/步长/禁用掩码、对称联动、科学计数法显示与自动精度推断。无论是构建教学演示中的变换矩阵,还是快速调节滤波系数、权重向量,都能与 marimo 的反应式数据流无缝衔接——修改任何单元格,下游计算即时更新。更多用法可参考 examples/ui/matrix.py,完整的参数文档与示例位于 docs/api/inputs/matrix.md。
【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考