【问题标题】:Split an integer into bins将整数拆分为 bin
【发布时间】:2018-08-01 18:50:06
【问题描述】:

给定一个整数和 bin 的数量,如何将整数分成尽可能相等的部分?

例如输出的总和应该等于输入的整数

[in]: x = 20 , num_bins = 3
[out]: (7, 7, 6)

另一个例子

[in]: x = 20 , num_bins = 6
[out]: (4, 4, 3, 3, 3, 3)

我试过了:

x = 20
num_bins = 3
y = [int(x/num_bins)] * num_bins
for i in range(x%num_bins):
    y[i] += 1

它有效,但必须有更简单/更好的方法,也许使用bisectnumpy

使用来自 https://stackoverflow.com/a/48899071/610569numpy ,我也可以这样做:

list(map(len, np.array_split(range(x), num_bins)))

但这与创建生成以获取假冒列表并获取长度有点复杂。

【问题讨论】:

  • num_bins = 6 的例子应该是5
  • 哎呀错字! ;P
  • 顺便说一句,你的算法看起来对我来说已经足够好了。我没有任何意见。

标签: python list numpy split


【解决方案1】:

内置的divmod 函数可能对此很有用。

def near_split(x, num_bins):
    quotient, remainder = divmod(x, num_bins)
    return [quotient + 1] * remainder + [quotient] * (num_bins - remainder)

演示

In [11]: near_split(20, 3)
Out[11]: [7, 7, 6]
In [12]: near_split(20, 6)
Out[12]: [4, 4, 3, 3, 3, 3]

【讨论】:

    【解决方案2】:

    更新使用整数运算进行简化。

    这是一个单行:

    np.arange(n+k-1, n-1, -1) // k
    

    小演示:

    >>> for k in range(4, 10, 3):
    ...     for n in range(10, 17):
    ...         np.arange(n+k-1, n-1, -1) // k
    ... 
    array([3, 3, 2, 2])
    array([3, 3, 3, 2])
    array([3, 3, 3, 3])
    array([4, 3, 3, 3])
    array([4, 4, 3, 3])
    array([4, 4, 4, 3])
    array([4, 4, 4, 4])
    array([2, 2, 2, 1, 1, 1, 1])
    array([2, 2, 2, 2, 1, 1, 1])
    array([2, 2, 2, 2, 2, 1, 1])
    array([2, 2, 2, 2, 2, 2, 1])
    array([2, 2, 2, 2, 2, 2, 2])
    array([3, 2, 2, 2, 2, 2, 2])
    array([3, 3, 2, 2, 2, 2, 2])
    

    【讨论】:

    • 不错!没想到这样用linspace
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2017-04-15
    • 2016-11-28
    • 2018-01-06
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多