将整数拆分为bin

alv*_*vas 6 python split numpy list

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

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

[in]: x = 20 , num_bins = 3
[out]: (7, 7, 6)
Run Code Online (Sandbox Code Playgroud)

另一个例如

[in]: x = 20 , num_bins = 6
[out]: (4, 4, 3, 3, 3, 3)
Run Code Online (Sandbox Code Playgroud)

我试过这个:

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

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

使用numpy/sf/answers/3422935001/,我可以这样做太:

list(map(len, np.array_split(range(x), num_bins)))
Run Code Online (Sandbox Code Playgroud)

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

mir*_*ulo 5

内置divmod函数可能对此有用.

def near_split(x, num_bins):
    quotient, remainder = divmod(x, num_bins)
    return [quotient + 1] * remainder + [quotient] * (num_bins - remainder)
Run Code Online (Sandbox Code Playgroud)

演示

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]
Run Code Online (Sandbox Code Playgroud)


Pau*_*zer 5

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

这是一行:

np.arange(n+k-1, n-1, -1) // k
Run Code Online (Sandbox Code Playgroud)

小演示:

>>> 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])
Run Code Online (Sandbox Code Playgroud)