我有一个元素数组,例如r = np.arange(15)
.
例如:split_to_chunks(np.arange(15), M=5, m=1)
应生成四个列表:
显然,这可以迭代完成,但我正在寻找一种更"pythonic"(更快)的方法.
我有一个元素数组,例如r = np.arange(15)
.
例如:split_to_chunks(np.arange(15), M=5, m=1)
应生成四个列表:
显然,这可以迭代完成,但我正在寻找一种更"pythonic"(更快)的方法.
类似于列表理解:
[l[i*(M-m):i*(M-m)+M] for i in range(math.ceil((len(l)-m)/(M-m)))]
Example:
import math
l = list(range(15))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
m, M = 2, 5
[l[i*(M-m):i*(M-m)+M] for i in range(math.ceil((len(l)-m)/(M-m)))]
# [[0, 1, 2, 3, 4],
# [3, 4, 5, 6, 7],
# [6, 7, 8, 9, 10],
# [9, 10, 11, 12, 13],
# [12, 13, 14]]
m, M = 3, 5
[l[i*(M-m):i*(M-m)+M] for i in range(math.ceil((len(l)-m)/(M-m)))]
# [[0, 1, 2, 3, 4],
# [2, 3, 4, 5, 6],
# [4, 5, 6, 7, 8],
# [6, 7, 8, 9, 10],
# [8, 9, 10, 11, 12],
# [10, 11, 12, 13, 14]]
l = range(5)
m, M = 2, 3
[l[i*(M-m):i*(M-m)+M] for i in range(math.ceil((len(l)-m)/(M-m)))]
# [range(0, 3), range(1, 4), range(2, 5)]
Explanation:
区块i
从索引i*(M-m)
开始,然后在索引i*(M-m) + M
结束M个位置.
chunk index starts ends
-------------------------------------------------
0 0 M
1 M-m M-m+M = 2*M-m
2 2*M-m-m=2(M-m) 2*(M-m)+M = 3M-2m
...
现在的问题是确定有多少块.
在每个步骤中,我们将初始索引增加M-m
,因此为了计算步骤总数,我们需要将列表的长度除以M-m
(但减go m
后,因为在第一个块中,我们没有跳过任何内容).
最后,使用天花板函数添加最后一个不完整的块,以防划分不准确.