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)
它有效,但必须有一个更简单/更好的方式,也许使用bisect或numpy?
使用numpy从/sf/answers/3422935001/,我可以这样做太:
list(map(len, np.array_split(range(x), num_bins)))
Run Code Online (Sandbox Code Playgroud)
但这有点令人费解,因为创建一个生成来获取假装列表并获得长度.
内置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)
使用整数运算进行更新简化。
这是一行:
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)