Streamlit应用输入改造:矩阵运算终端转网页交互及代码修复
修复Streamlit矩阵运算代码的输入迁移问题
问题出在这几个地方
t的维度与类型问题:原代码里t是嵌套列表(每个元素是单元素列表),改完后变成普通数值列表,虽然numpy能自动适配,但没设置默认整数,容易出现浮点值干扰运算。l的输入逻辑错了:需求是一次输入多个值放进同一个列表,但你改成了多个独立输入框,提示还重复,完全不符合交互要求。- 空输入直接报错:没给
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
相关产品推荐
相关产品推荐

