Python多数组传入while循环触发真值模糊ValueError问题求助
错误原因分析
- 报错触发逻辑:当你在Python的
if/while等需要单个布尔值的判断场景中,传入了包含多个布尔值的numpy数组时,解释器无法确定整个表达式的真假,就会抛出该错误。 - 具体到你的代码存在多处同类风险:
- 测试用例中传入的
max_iteration是np.array([10000, 10000])数组,而循环变量count是单个整数,count < max_iteration的计算结果是array([True, True])格式的布尔数组,while判断无法识别该结果,直接触发报错。 - 后续的
if abs(last_value - new_value) < epsilon_convergence_value、if new_value < min_value也会触发同类报错:你传入的epsilon_convergence_value是数组,且corroded_wall_thickness等入参都是数组,elastic_buckling_pressure返回的new_value也会是数组,条件判断的结果都是多值布尔数组。
- 测试用例中传入的
修复方案
根据你的使用场景二选一即可:
方案1:按组传入单值参数(推荐)
如果你的需求是对数组里的两组参数分别执行迭代计算,不要把整个数组直接传入函数,改为拆分后单组调用:
import numpy as np import itertools def test_iteration_calculation(): # 按列拆分参数为两组单值参数 arg_groups = list(zip( np.array([10, 10]), np.array([250, 250]), np.array([0.5, 0.5]), np.array([350000, 350000]), np.array([0.33, 0.33]), np.array([10000, 10000]), np.array([1, 1]) )) # 每组参数单独调用迭代计算函数 all_results = [iteration_calculation(*group) for group in arg_groups] # 后续处理结果传入rb_value_selector_function即可 output_list = [] for res in all_results: output_list.append(itertools.starmap(rb_value_selector_function, res)) # 按需转为numpy数组
方案2:修改判断逻辑适配数组入参
如果你确定需要传入数组批量计算,在所有条件判断处按业务需求添加.all()(所有元素满足条件才成立)或.any()(任意元素满足条件即成立),将布尔数组转为单个布尔值:
# while判断修改为所有元素都满足循环条件才继续 while (count < max_iteration).all(): new_value = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness, external_radius_mm=external_radius_mm, lambda_value=lambda_value, n_value=changed_n_value, youngs_modulus_mpa=youngs_modulus_mpa, poissons_ratio=poissons_ratio) list_value[changed_n_value] = new_value # 收敛判断修改为所有元素都满足收敛条件才退出 if (abs(last_value - new_value) < epsilon_convergence_value).all(): break last_value = new_value # 最小值判断修改为所有元素都小于当前最小值才更新 if (new_value < min_value).all(): min_value = new_value min_key =changed_n_value changed_n_value += 0.10 count += 1
内容的提问来源于stack exchange,提问作者bmaster69
相关产品推荐
相关产品推荐

