首页 > 解决方案 > 使用 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

但是,我不确定如何解决这个问题。有任何想法吗?

标签: pythonarraysnumpyfifo

解决方案


一种更简洁的方式,使用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 的过程。它是矢量化的。


推荐阅读