将整数拆分为bin

时间:2018-02-22 02:22:50

标签: python list numpy split

给定一个整数和二进制数,如何将整数拆分为尽可能相等的部分?

E.g。输出的总和应该等于输入整数

[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/610569中的numpy,我也可以这样做:

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

但这有点令人费解,因为创建一个生成来获取假装列表并获得长度。

2 个答案:

答案 0 :(得分:5)

内置的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]

答案 1 :(得分: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])