我有一个任意长度的列表,我需要将它分成相同大小的块并对其进行操作.有一些明显的方法可以做到这一点,比如保留一个计数器和两个列表,当第二个列表填满时,将它添加到第一个列表并清空下一轮数据的第二个列表,但这可能非常昂贵.
我想知道是否有人对任何长度的列表都有一个很好的解决方案,例如使用生成器.
我一直在寻找有用的东西,itertools但我找不到任何明显有用的东西.但是可能会错过它.
将列表划分为大致相等的部分的最佳方法是什么?例如,如果列表有7个元素并将其拆分为2个部分,我们希望在一个部分中获得3个元素,而另一个应该具有4个元素.
我正在寻找像even_split(L, n)这样的东西L分成n几部分.
def chunks(L, n):
""" Yield successive n-sized chunks from L.
"""
for i in xrange(0, len(L), n):
yield L[i:i+n]
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了3个块,而不是3个块.我可以简单地转置(迭代它并获取每列的第一个元素,调用第一部分,然后取第二部分并将其放入第二部分等),但这会破坏项目的顺序.
我想要一个算法迭代列表切片.切片大小设置在功能之外,可以有所不同.
在我看来它是这样的:
for list_of_x_items in fatherList:
foo(list_of_x_items)
Run Code Online (Sandbox Code Playgroud)
有没有办法正确定义list_of_x_items或使用python 2.5执行此操作的其他方法?
edit1:澄清 "分区"和"滑动窗口"这两个术语听起来都适用于我的任务,但我不是专家.所以我会更深入地解释这个问题并添加到问题中:
fatherList是我从文件中获取的多级numpy.array.函数必须找到系列的平均值(用户提供系列的长度)平均我正在使用该mean()函数.现在进行问题扩展:
edit2:如何修改你提供的函数来存储额外的项目,并在下一个fatherList被输入函数时使用它们?
例如,如果列表长度为10且块的大小为3,则列表的第10个成员将被存储并附加到下一个列表的开头.
我已经阅读了Python的答案:将列表切成n个近似等长的分区问题.
这是公认的答案:
def partition(lst, n):
division = len(lst) / float(n)
return [ lst[int(round(division * i)): int(round(division * (i + 1)))] for i in xrange(n) ]
Run Code Online (Sandbox Code Playgroud)
我想知道,为了将项目随机分配给分区而不是增量分配,如何修改这些解决方案.
谢谢,S :-)
我有一个总和,我正在尝试计算,我很难并行化代码.我试图并行化的计算有点复杂(它使用numpy数组和scipy稀疏矩阵).它吐出一个numpy数组,我想从大约1000个计算中求和输出数组.理想情况下,我会在所有迭代中保持运行总和.但是,我还没弄清楚如何做到这一点.
到目前为止,我已经尝试使用joblib的Parallel函数和pool.map函数与python的多处理包.对于这两个,我使用一个返回numpy数组的内部函数.这些函数返回一个列表,我将其转换为numpy数组,然后求和.
但是,在joblib并行函数完成所有迭代后,主程序永远不会继续运行(看起来原始作业处于挂起状态,使用0%CPU).当我使用pool.map时,在所有迭代完成后我得到内存错误.
有没有办法简单地并行化运行的数组总和?
编辑:目标是做以下的事情,除了并行.
def summers(num_iters):
sumArr = np.zeros((1,512*512)) #initialize sum
for index in range(num_iters):
sumArr = sumArr + computation(index) #computation returns a 1 x 512^2 numpy array
return sumArr
Run Code Online (Sandbox Code Playgroud) 我有范围内的元素总数N和一些块nb
我想N分成nb最好的相等范围,只有开始编号和结束编号。例如,N=24并且nb=5应该输出:
0,5 5,10 10,15 15,20 20,24
Run Code Online (Sandbox Code Playgroud)
WhileN=28和nb=5应输出:
0,5 5,10 10,16 16,22 22,28 (the rest of `N/nb` division is equally distributed on the 3 last subranges)
Run Code Online (Sandbox Code Playgroud)
基于一个评论,我有这个方法:
def partition(lst, n):
division = len(lst) / n
return [lst[round(division * i):round(division * (i + 1))] for i in range(n)]
def ranges(N, nb):
return ["{},{}".format(r.start, r.stop) for r in partition(range(N), nb)]
>>> ranges(28, 5)
['0,6', '6,11', '11,17', '17,22', …Run Code Online (Sandbox Code Playgroud)