如何在Numpy数组中添加由行内现有值计算的列(BMI示例)
在Numpy数组中添加计算得到的BMI列
问题分析
你当前的代码存在两个核心问题:
- 身高列提取错误:
female[:,:1]取的是数组第一列(体重),而非身高列,应该改为female[:,1]或female[:,1:2]获取第二列的身高数据。 - 结果格式不符合需求:循环中append的是单个元素的numpy数组,最终得到的是数组列表,无法直接和原数组合并。Numpy的核心优势是向量化运算,完全不需要用逐行循环来实现。
正确实现步骤
假设female是n行2列的数组,第一列为体重(单位:kg),第二列为身高(分两种情况处理):
情况1:原始身高单位是厘米(需转为米)
# 提取体重(一维数组) weights = female[:, 0] # 提取身高并转换为米 heights = female[:, 1] / 100 # 向量化计算BMI,四舍五入保留2位小数 bmi = np.round(weights / (heights ** 2), 2) # 将BMI转为二维数组后,与原数组合并 female_with_bmi = np.column_stack((female, bmi))
情况2:原始身高单位已经是米(如你给出的示例)
去掉身高转换的步骤即可:
# 直接用原数组列进行向量化计算 bmi = np.round(female[:, 0] / (female[:, 1] ** 2), 2) # 合并数组(reshape将一维BMI转为n行1列的二维结构,匹配原数组维度) female_with_bmi = np.hstack((female, bmi.reshape(-1, 1)))
验证示例
如果输入的female数组是:
female = np.array([[100, 1.5], [130, 1.6]])
运行代码后得到的female_with_bmi结果为:
array([[100. , 1.5 , 44.44], [130. , 1.6 , 50.78]])
和你期望的格式完全一致(小数位差异是计算精度导致,可通过调整np.round的参数控制)。
为什么不用循环?
Numpy的向量化运算比Python循环效率高得多,尤其是数组规模较大时,能显著提升运行速度,同时代码更简洁易读。
内容的提问来源于stack exchange,提问作者Riley Oussoren
相关产品推荐
相关产品推荐

