【问题标题】:sum from array until a given value is reached.从数组求和,直到达到给定值。
【发布时间】:2019-02-21 13:30:40
【问题描述】:

我有几个带有值的 numpy 数组,如下所示:

po_freq1 = [0.01408451 0.05633803 0.14084507 0.02816901 0.01408451 0.01408451
0.05633803 0.05633803 0.01408451 0.01408451 0.01408451 0.01408451
0.02816901 0.07042254 0.01408451 0.01408451 0.04225352 0.11267606
0.04225352 0.01408451 0.04225352 0.02816901 0.01408451 0.04225352
0.05633803 0.01408451 0.01408451 0.01408451]

我的目标是从我的数组中随机选择一些值并将这些值相加,直到达到给定值,例如 0.90。有人有想法吗?

【问题讨论】:

  • 使用简单的while 循环应该可以完成这项工作。不要用迭代器或累加器之类的东西想太多。
  • 一种方法:继续从数组中提取随机值,并将其添加到保存部分和的变量中,直到达到哨兵值。无论如何,请向我们展示您的尝试。
  • 你已经尝试了什么?
  • “达到”是指“超过”吗?是否允许重复选择(除了您列表中的重复选项)?
  • 这听起来本身就是一个非常荒谬的任务。除了该操作,您还需要做任何事情吗?还记得你选择了哪些元素吗?尽量减少与目标的差异?

标签: python python-2.7 numpy random


【解决方案1】:

您可以使用cumsumargmin,将数组打乱以使选择随机:

arr = np.array([0.87868619, 0.08184167, 0.01502171, 0.96840561, 0.31431041,
       0.531577  , 0.66069971, 0.1204876 , 0.9684556 , 0.81405872,
       0.48118081, 0.91681978, 0.15017044, 0.50540813, 0.11617046,
       0.01897202, 0.1894475 , 0.94660911, 0.46030856, 0.04641654])
np.random.shuffle(arr)

5 的阈值为例:

>>> (np.cumsum(arr)<=5).argmin()
11

这为您提供了应该停止求和的索引。这将比 while 循环更快,因为这些操作是矢量化的。

In [38]: np.sum(arr[:11])
Out[38]: 4.15852117

In [39]: np.sum(arr[:12])
Out[39]: 5.126976770000001

【讨论】:

    【解决方案2】:

    使用随机包和while循环

    import random
    po_freq1 = [0.01408451, 0.05633803, 0.14084507, 0.02816901, 0.01408451, 0.01408451,
    0.05633803, 0.05633803, 0.01408451, 0.01408451, 0.01408451, 0.01408451,
    0.02816901, 0.07042254, 0.01408451, 0.01408451, 0.04225352, 0.11267606,
    0.04225352, 0.01408451, 0.04225352, 0.02816901, 0.01408451, 0.04225352,
    0.05633803, 0.01408451, 0.01408451, 0.01408451]
    
    sumv = 0.
    while sumv<0.9: sumv += random.choice(po_freq1)
    print (sumv)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多