0

0

使用 NumPy 高效计算不同价格商品的客户平均购买价格

聖光之護

聖光之護

发布时间:2025-08-31 20:12:01

|

1022人浏览过

|

来源于php中文网

原创

使用 numpy 高效计算不同价格商品的客户平均购买价格

引言

本文介绍如何使用 NumPy 解决一个常见的分配问题:根据商品的不同价格和库存数量,以及客户的订单数量,计算每个客户的平均购买价格。重点在于利用 NumPy 的 repeat 和 add.reduceat 函数,避免创建大型中间数组,从而提高计算效率。同时,也讨论了处理浮点数精度问题的一种方法。

问题描述

假设你有一批商品,它们以不同的价格出售,并且有不同的库存数量。现在有一组客户,他们各自订购了不同数量的商品。你需要按照“先到先得”的原则,从价格最低的商品开始分配,计算每个客户的平均购买价格。

例如,你有以下数据:

  • 客户订单 (orders): [21, 6, 3] (Mark 订购 21 个,Greg 订购 6 个,Paul 订购 3 个)
  • 商品数量 (quantity): [16, 14] (有 16 个商品价格为 $30.5,14 个商品价格为 $35.5)
  • 商品价格 (price): [30.5, 35.5]

目标是计算 Mark、Greg 和 Paul 的平均购买价格。

NumPy 解决方案

一种低效的方法是创建一个大型数组,将每个商品的价格重复相应的数量,然后计算每个客户订单的平均值。但是,这种方法在商品数量很大时会非常慢。

更高效的 NumPy 解决方案是使用 np.repeat 和 np.add.reduceat 函数。

BJXSHOP网上开店专家
BJXSHOP网上开店专家

BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛

下载
import numpy as np

orders = np.array([21, 6, 3], dtype=np.int64)
quantity = np.array([16, 14], dtype=np.int64)
price = np.array([30.5, 35.5], dtype=np.double)

out = np.add.reduceat(np.repeat(price, quantity),
                      np.r_[0, np.cumsum(orders)][:-1]
                     ) / orders

print(out)
# 输出: [31.69047619 35.5        35.5       ]

代码解释:

  1. np.repeat(price, quantity): 此函数将 price 数组中的每个元素重复相应的 quantity 次数。例如,np.repeat([30.5, 35.5], [16, 14]) 将生成一个包含 16 个 30.5 和 14 个 35.5 的数组。
  2. np.cumsum(orders): 此函数计算 orders 数组的累积和。例如,np.cumsum([21, 6, 3]) 将生成 [21, 27, 30]。
  3. np.r_[0, np.cumsum(orders)][:-1]: 此表达式创建一个起始索引数组,用于 np.add.reduceat 函数。np.r_[0, np.cumsum(orders)] 将 0 添加到累积和数组的开头,然后 [:-1] 删除最后一个元素。因此,对于我们的示例,它将生成 [ 0, 21, 27]。
  4. np.add.reduceat(np.repeat(price, quantity), np.r_[0, np.cumsum(orders)][:-1]): 此函数沿着由 np.repeat 创建的数组,在指定的索引处进行求和。索引由 np.r_[0, np.cumsum(orders)][:-1] 提供。因此,它将计算 Mark (索引 0-20), Greg (索引 21-26) 和 Paul (索引 27-29) 的总价格。
  5. / orders: 最后,将总价格除以每个客户的订单数量,以获得平均价格。

处理浮点数精度问题

由于浮点数的精度限制,计算平均价格时可能会出现一些小的误差。为了解决这个问题,可以确保平均价格乘以数量等于原始价格乘以数量的总和。

可以使用以下方法:

import numpy as np

orders = np.array([21, 6, 3], dtype=np.int64)
quantity = np.array([16, 14], dtype=np.int64)
price = np.array([30.5, 35.5], dtype=np.double)

total_price = np.sum(price * quantity)
out = np.add.reduceat(np.repeat(price, quantity),
                      np.r_[0, np.cumsum(orders)][:-1]
                     )
out = out / orders
# 检查总价格是否一致
calculated_total_price = np.sum(out * orders)

print(out)
print(f"Total price should be: {total_price}")
print(f"Calculated total price: {calculated_total_price}")

在实际应用中,如果需要更高的精度,可以考虑使用 decimal 模块。

总结

本文介绍了如何使用 NumPy 高效地计算不同价格商品的客户平均购买价格。通过使用 np.repeat 和 np.add.reduceat 函数,可以避免创建大型中间数组,从而提高计算效率。此外,还讨论了处理浮点数精度问题的一种方法。这个方法可以应用于各种分配问题,例如库存管理、资源分配等。

相关专题

更多
html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

37

2026.01.21

三角洲入口地址合集
三角洲入口地址合集

本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

17

2026.01.21

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

228

2026.01.21

妖精漫画入口地址合集
妖精漫画入口地址合集

本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

59

2026.01.21

java版本选择建议
java版本选择建议

本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

6

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

27

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.8万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号