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

Streamlit应用输入改造:矩阵运算终端转网页交互及代码修复

修复Streamlit矩阵运算代码的输入迁移问题

问题出在这几个地方

  1. t的维度与类型问题:原代码里t是嵌套列表(每个元素是单元素列表),改完后变成普通数值列表,虽然numpy能自动适配,但没设置默认整数,容易出现浮点值干扰运算。
  2. l的输入逻辑错了:需求是一次输入多个值放进同一个列表,但你改成了多个独立输入框,提示还重复,完全不符合交互要求。
  3. 空输入直接报错:没给l设默认值,刚运行时输入为空,max(l)直接炸锅。

修复后的完整代码

import numpy as np
import streamlit as st

st.header('Input Data')
# 原始矩阵
p = np.array([[4,3,6,2],[1,4,3,5],[2,5,2,3],[5,2,4,1],[3,6,1,4]])
st.dataframe(p)

tb = len(p)
# 行乘法系数:每行一个独立输入,存成列表t(每个值都是单独元素)
t = []
for i in range(tb):
    val = st.sidebar.number_input(
        f'第{i}行乘法系数:',
        min_value=0, max_value=10, step=1, value=1  # 设默认值1,保证是整数
    )
    t.append(val)
st.write("行乘法系数列表:", t)

# 矩阵行重复次数:用单个输入框接收多个空格分隔的整数,转成列表l
st.sidebar.subheader("矩阵行重复次数设置")
l_input = st.sidebar.text_input(
    f"输入{tb}个空格分隔的整数(对应每行重复次数):",
    value="1 1 1 1 1"  # 默认每行重复1次,避免空输入报错
)
# 处理输入,转成整数列表,只取前tb个元素
try:
    l = list(map(int, l_input.strip().split()))[:tb]
    # 要是输入的数不够tb个,自动补1
    while len(l) < tb:
        l.append(1)
except ValueError:
    # 输入不是整数的话,直接用默认列表
    l = [1]*tb
st.write("行重复次数列表:", l)

# 矩阵行乘法运算
pt = np.multiply(p, t)  # numpy会自动把t的维度适配成和p每行匹配

# 生成重复后的行索引
m = max(l)
idx = np.tile(np.arange(len(pt)), m)
# 生成筛选条件,只保留需要重复的行
idx = idx[np.repeat(np.arange(m), len(l)) < np.tile(l, m)]
p_result = pt[idx]

st.header('Output Data')
st.write(p_result)

改完的代码做了这些调整

  • t的输入:保留每行独立的输入框,设置默认值1,确保输入都是整数,最终t就是每个值单独成元素的列表,符合要求。
  • l的输入:换成单个文本输入框,让用户一次输入多个空格分隔的数,自动转成整数列表,还加了异常处理,输入错了也不会崩。
  • 鲁棒性优化:给l加了默认值,处理输入长度不足的情况,避免刚打开页面就报错。
  • 修正索引逻辑:把原代码里被转义的<改回正常的小于号,保证索引生成正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:45:41