首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用numpy的FIFO方法

利用numpy的FIFO方法
EN

Stack Overflow用户
提问于 2019-11-11 14:23:59
回答 3查看 2K关注 0票数 0

我想使用numpy实现FIFO方法。具体来说,我有一个numpy数组STOCK,如下所示

代码语言:javascript
运行
复制
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,它如下所示

代码语言:javascript
运行
复制
SOLD = numpy.random.randint(1, 9, size=10_000)
SOLD = array([1, 7, 3, ..., 6, 8, 5])

其中每个数字代表每个类别销售的产品数量。

现在我想使用STOCK 方法更新 FIFO 数组,也就是说,我想预订每个产品类别的第一个累积的n个元素。在上述情况下,输出应该类似于

代码语言:javascript
运行
复制
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

然而,我不知道如何解决这个问题。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2019-11-11 14:44:01

我希望这是合适的。

代码语言:javascript
运行
复制
import numpy as np
np.random.seed(1)

STOCK = np.random.randint(1, 9, size=(10000, 10))
SOLD = np.random.randint(1, 9, size=10000)

i = 0

while SOLD.sum() > 0:
    # The minimum between the ith column of STOCK and SOLD
    MIN = np.minimum(SOLD, STOCK[:, i])

    STOCK[:, i] -= MIN
    SOLD -= MIN

    i += 1
票数 0
EN

Stack Overflow用户

发布于 2019-11-11 19:39:09

一种更简洁的方式,使用cumsum

代码语言:javascript
运行
复制
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的进程。它是矢量化的。

票数 0
EN

Stack Overflow用户

发布于 2019-11-12 14:11:26

更新:我找到了一个非常快速的解决方案(类似于的解决方案)

代码语言:javascript
运行
复制
numpy.random.seed(1) 
STOCK = numpy.random.randint(1, 9, size=(10_000, 10))  
SOLD = numpy.random.randint(1, 9, size=10_000) 

def book_out(stock, sold):
    booking_out = numpy.minimum(stock.cumsum(axis=1), sold[:,None])
    booking_out[:,1:] -= booking_out[:,:-1] 
    stock -= booking_out
代码语言:javascript
运行
复制
%timeit book_out(STOCK.copy(), SOLD.copy())
> 1.13 ms ± 5.79 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58803214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档