NumPy根据条件用数组替换值

2024-04-20 10:51:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试生产一个分拣机,对于每一周的总数(对于多个不同的产品),根据最大允许累积减去已经分拣的内容,将它们放在正确的桶中。你知道吗

maxes=np.array([100,200,300],[100,400,900])
weeklytotals=np.array([100,150,200,250],[200,400,600,800)]

所需输出为:

result=np.array([[100,0,0],[100,50,0],[100,100,0],[100,150,0]],[[100,100,0],[100,300,0],[100,400,100],[100,400,300]]

我不想使用循环,但我正在绞尽脑汁如何避免这种方法。提前谢谢,还是个Python初学者。我想使用NumPy,因为最终实现需要非常快。你知道吗


Tags: 方法numpy内容产品npresultarray总数
1条回答
网友
1楼 · 发布于 2024-04-20 10:51:02

一种矢量化方法可以是:

result = np.minimum(weeklytotals[:,:,None], maxes.cumsum(1)[:,None,:])
result[...,1:] -= result[...,:-1]
result

#array([[[100,   0,   0],
#        [100,  50,   0],
#        [100, 100,   0],
#        [100, 150,   0]],

#       [[100, 100,   0],
#        [100, 300,   0],
#        [100, 400, 100],
#        [100, 400, 300]]])

首先计算铲斗的累积容量:

maxes.cumsum(1)
#array([[ 100,  300,  600],
#       [ 100,  500, 1400]])

通过取每周总量和容量之间的最小值,计算桶中的累积量:

result = np.minimum(weeklytotals[:,:,None], maxes.cumsum(1)[:,None,:])

#array([[[100, 100, 100],
#        [100, 150, 150],
#        [100, 200, 200],
#        [100, 250, 250]],

#       [[100, 200, 200],
#        [100, 400, 400],
#        [100, 500, 600],
#        [100, 500, 800]]])

取两个桶之间的金额差额并将其分配回(第一个桶除外):

result[...,1:] -= result[...,:-1]
result

相关问题 更多 >