如何解决AttributeError: 'numpy.float64'对象无'empty'属性问题?
问题与解决思路
问题详情
我正在对包含10个微分方程、38个参数的系统执行敏感性分析,代码如下:
# 定义敏感性分析问题 problem = { 'num_vars': num_vars, 'names': p_names, 'bounds': bounds } # 用Saltelli采样法生成参数样本 num_samples = 256 # 样本数量 param_values = saltelli.sample(problem, num_samples, calc_second_order=False) # 为每个参数样本运行模型,初始化结果数组 results = numpy.empty([param_values.shape[0], 10])
运行后持续报错:
AttributeError: 'numpy.float64' object has no attribute 'empty'
已尝试的操作:
- 将
param_values格式转为float、np.float64或其他数组/列表类型 - 替换
np.empty为np.zeros、np.ones - 降级numpy版本至1.24.3(当前Python版本3.11)
以上操作均未解决问题,且找不到替代np.empty的Python内置函数。
错误原因分析
这个错误的核心是**np被意外覆盖成了numpy.float64类型的变量**,而非numpy模块本身。比如代码其他位置可能存在np = 某个浮点数这类赋值,导致调用np.empty时,实际是在一个float对象上调用不存在的empty方法。
另外需要验证param_values的类型:如果param_values是单个float64值而非二维数组,说明problem字典配置有误(比如num_vars未设为38、bounds格式不符合要求),导致Saltelli采样失败,只返回了单个数值,进一步引发后续代码异常。
解决方案
统一numpy导入方式:
- 要么全程使用
import numpy,代码中写numpy.empty - 要么使用
import numpy as np,代码中统一写np.empty
绝对不要在代码中把np作为普通变量名使用(比如避免np = param_values[0][0]这类赋值)
- 要么全程使用
检查
problem配置正确性:- 确认
num_vars的值为38(对应参数数量) - 确认
bounds是包含38个二元组的列表,每个二元组对应一个参数的上下界,格式如[(lower1, upper1), (lower2, upper2), ..., (lower38, upper38)]
- 确认
验证
param_values类型:
在生成param_values后添加代码:print(type(param_values)) print(param_values.shape)正常情况下应该输出
<class 'numpy.ndarray'>和(样本数, 38)的形状。如果输出是单个数值,说明采样逻辑有问题,需要排查saltelli.sample的输入参数。
内容的提问来源于stack exchange,提问作者Luciano G Fernandes
相关产品推荐
相关产品推荐

