【问题标题】:NumPy replace values with arrays based on conditionsNumPy 根据条件用数组替换值
【发布时间】:2017-07-23 19:19:47
【问题描述】:

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

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

【问题讨论】:

  • 你能添加一个循环的解决方案吗?帮助我们验证人们可能建议的任何潜在方法。
  • 当然。现在正在努力。

标签: python arrays sorting numpy


【解决方案1】:

一种矢量化方法可能是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2019-05-20
    • 2017-07-19
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多