NumPy根据条件用数组替换值

时间:2017-07-23 19:19:48

标签: python arrays sorting numpy

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

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,因为最终的实现需要非常快。

1 个答案:

答案 0 :(得分:3)

一种矢量化方法可能是:

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