我有一个元素数组,例如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后,因为在第一个块中,我们没有跳过任何内容).

最后,使用天花板函数添加最后一个不完整的块,以防划分不准确.

Python相关问答推荐

如果条件为真,则Groupby.mean()

重新匹配{ }中包含的文本,其中文本可能包含{{var}

如何制作10,000年及以后的日期时间对象?

django禁止直接分配到多对多集合的前端.使用user.set()

pyscript中的压痕问题

对象的`__call__`方法的setattr在Python中不起作用'

Pandas DataFrame中行之间的差异

Pandas—在数据透视表中占总数的百分比

在用于Python的Bokeh包中设置按钮的样式

使用类型提示进行类型转换

mdates定位器在图表中显示不存在的时间间隔

没有内置pip模块的Python3.11--S在做什么?

如何将返回引用的函数与pybind11绑定?

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

如何写一个polars birame到DuckDB

启动线程时,Python键盘模块冻结/不工作

如何从一个维基页面中抓取和存储多个表格?

如何在不不断遇到ChromeDriver版本错误的情况下使用Selify?

如何批量训练样本大小为奇数的神经网络?

Python:使用asyncio.StreamReader.readline()读取长行