python - 使用 numpy 的 FIFO 方法
问题描述
我想使用 numpy 实现 FIFO 方法。具体来说,我有一个STOCK
看起来像这样的 numpy 数组
import numpy
numpy.random.seed(1)
STOCK = numpy.random.randint(1, 9, size=(10_000, 10))
STOCK = array([
[6, 4, 5, ..., 6, 8, 1],
[1, 2, 5, ..., 2, 3, 5],
[7, 6, 3, ..., 5, 6, 7],
...,
[2, 5, 8, ..., 7, 6, 1],
[2, 8, 7, ..., 2, 8, 4],
[1, 2, 6, ..., 1, 1, 3]])
,其中每一行代表不同的产品类别,每一列代表在特定日期购买的商品数量。
现在,我有第二个数组SOLD
,看起来像这样
SOLD = numpy.random.randint(1, 9, size=10_000)
SOLD = array([1, 7, 3, ..., 6, 8, 5])
其中每个数字代表每个类别销售的产品数量。
现在我想使用FIFO方法更新STOCK
数组。意思是,我想预订每个产品类别的第一个累积 n 个元素。在上述情况下,输出应该类似于
UPDATED_STOCK= array([
[5, 4, 5, ..., 6, 8, 1], # 6-1, 4, 5, ... BOOKED OUT=1
[0, 0, 1, ..., 2, 3, 5], # 1-1, 2-2, 5-4, ... BOOKED OUT=7
[4, 6, 3, ..., 5, 6, 7], # 7-3, 6, 3, ... BOOKED OUT=3
...,
[0, 1, 8, ..., 7, 6, 1], # 2-2, 5-4, 8, ... BOOKED OUT=6
[0, 2, 7, ..., 2, 8, 4], # 2-2, 8-6, 7, ... BOOKED OUT=8
[0, 0, 4, ..., 1, 1, 3]]) # 1-1, 2-2, 6-2, ... BOOKED OUT=5
但是,我不确定如何解决这个问题。有任何想法吗?
解决方案
一种更简洁的方式,使用cumsum
:
import numpy as np
x = np.random.randint(1,10, size=(7, 5))
out = np.random.randint(1,10, size=(7, 1))
print(x, out)
cum = x.cumsum(1)
np.diff(np.hstack((np.zeros(x.shape[0])[:,None], np.clip(cum - out, 0, cum.max()))))
本质上,您对数组进行累积求和,取出out
, 剪辑为 0 并将其相加。这将重现类似 FIFO 的过程。它是矢量化的。
推荐阅读
- python - 如何为 ML 算法从 str 日期制作特征
- v8 - 如何从 FunctionCallbackInfo 之外的函数中读取数据值?
- swift - 基于子对象列表中的值的领域过滤结果
- c# - 在部分视图中使用嵌套内容时,所有部分视图项都相同我正在使用 Umbraco 8
- firebase - Firebase 云函数/每个 then() 应该返回一个值或抛出 promise/always-return
- javascript - 如何将 XML 数据插入 HTML?
- java - 如何检查具有多列子查询的查询的单列?
- r - 如何将日期时间列从“非UTC”格式转换为“UTC”格式,而不会丢失R中时间变化的日子里的数据
- gps - 如何从 GPS 获取 NED 速度?
- swift - 添加子视图并放在前面,但仍未显示