Python-根据数组值将数组拆分为多个数组

Python-根据数组值将数组拆分为多个数组,python,arrays,numpy,split,Python,Arrays,Numpy,Split,我有一个列表,需要分为多个不同大小的列表。原始列表中的值的大小随机增加,直到分割点,此时值在继续增加之前会下降。拆分后,这些值必须保持有序 例如。 原始列表 [100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631, 70, 119, 125, 130, 134, 139, 144, 149, 154, 159, 614, 669, 100, 136, 144, 149, 153, 158, 163, 167, 173,

我有一个列表,需要分为多个不同大小的列表。原始列表中的值的大小随机增加,直到分割点,此时值在继续增加之前会下降。拆分后,这些值必须保持有序

例如。 原始列表

[100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631, 70, 119, 
125, 130, 134, 139, 144, 149, 154, 159, 614, 669, 100, 136, 144, 149, 153, 
158, 163, 167, 173, 179, 62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 
124, 426, 100, 129, 135, 140, 145, 151]
拆分后:

[100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631]
[70, 119, 125, 130, 134, 139, 144, 149, 154, 159, 614, 669]
[100, 136, 144, 149, 153, 158, 163, 167, 173, 179]
[62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 124, 426]
[100, 129, 135, 140, 145, 151]
我已经搜索了一个解决方案,找到了
numpy.where
numpy.diff
作为可能的候选,但我不确定如何实现

谢谢你的帮助

方法#1

使用NumPy的
NumPy.split
将数组列表作为输出-

import numpy as np

arr = np.array(a) # a is input list
out = np.split(arr,np.flatnonzero(arr[1:] < arr[:-1])+1)
给定样本的输出-

In [52]: idx = np.r_[0, np.flatnonzero(np.diff(a)<0)+1, len(a)]

In [53]: [a[idx[i]:idx[i+1]] for i in range(len(idx)-1)]
Out[53]: 
[[100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631],
 [70, 119, 125, 130, 134, 139, 144, 149, 154, 159, 614, 669],
 [100, 136, 144, 149, 153, 158, 163, 167, 173, 179],
 [62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 124, 426],
 [100, 129, 135, 140, 145, 151]]
让我们计时,看看是否有任何改进-

In [84]: a = np.random.randint(0,100,(1000,100)).cumsum(1).ravel().tolist()

In [85]: %timeit np.r_[0, np.flatnonzero(np.diff(a)<0)+1, len(a)]
100 loops, best of 3: 3.24 ms per loop

In [86]: arr = np.asarray(a)

In [87]: %timeit np.asarray(a)
100 loops, best of 3: 3.05 ms per loop

In [88]: %timeit np.r_[0, np.flatnonzero(arr[1:] < arr[:-1])+1, len(arr)]
10000 loops, best of 3: 77 µs per loop

In [89]: 3.05+0.077
Out[89]: 3.127
[84]中的
a=np.random.randint(0100,(1000100)).cumsum(1.ravel().tolist()

在[85]:%timeit np.r_0,np.flatnonzero(np.diff(a)中,我知道您标记了
numpy
。但这里还有一个没有任何依赖关系的实现:

lst = [100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631, 70, 119, 
125, 130, 134, 139, 144, 149, 154, 159, 614, 669, 100, 136, 144, 149, 153, 
158, 163, 167, 173, 179, 62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 
124, 426, 100, 129, 135, 140, 145, 151]

def split(lst):
  last_pos = 0
  for i in range(1, len(lst)):
    if lst[i] < lst[i-1]:
      yield lst[last_pos:i]
      last_pos = i
  if(last_pos <= len(lst)-1):
    yield lst[last_pos:]

print([x for x in split(lst)])
lst=[1005645725785845906026086146206256317119,
125, 130, 134, 139, 144, 149, 154, 159, 614, 669, 100, 136, 144, 149, 153, 
158, 163, 167, 173, 179, 62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 
124, 426, 100, 129, 135, 140, 145, 151]
def拆分(lst):
最后位置=0
对于范围(1,len(lst))中的i:
如果lst[i]如果(last_pos如果要使用
numpy.diff
numpy.where
,可以尝试

a = numpy.array(your original list)
numpy.split(a, numpy.where(numpy.diff(a) < 0)[0] + 1)
a=numpy.array(您的原始列表)
numpy.split(a,numpy.where(numpy.diff(a)<0)[0]+1)
说明:

numpy.diff(a)
计算每个项目与其前一个项目的差异,并返回一个数组

numpy.diff(a)<0
返回一个布尔数组,其中每个元素被替换为是否满足谓词,在本例中小于零。这是
numpy.ndarray
重载比较运算符的结果

numpy.where
获取此布尔数组并返回元素不为零的索引。在此上下文中,
False
的计算结果为零,因此您获取
True
的索引

[0]
取第一个(也是唯一一个)轴

+1
您希望在索引之后而不是之前中断


最后,
numpy.split
在给定的索引处将它们断开。

好的。可能有一些快速而优雅的解决方案,但是为什么不先尝试用一个简单的
while
循环来实现这一点呢?看看np是指numpy吗?你需要一个“将numpy导入为np”,也许第二个版本“仅列表”是什么?您仍在使用两个
numpy
函数。@亚历克西斯:是的,您是对的。编辑后的单词会更好。
lst = [100, 564, 572, 578, 584, 590, 596, 602, 608, 614, 620, 625, 631, 70, 119, 
125, 130, 134, 139, 144, 149, 154, 159, 614, 669, 100, 136, 144, 149, 153, 
158, 163, 167, 173, 179, 62, 72, 78, 82, 87, 92, 97, 100, 107, 112, 117, 
124, 426, 100, 129, 135, 140, 145, 151]

def split(lst):
  last_pos = 0
  for i in range(1, len(lst)):
    if lst[i] < lst[i-1]:
      yield lst[last_pos:i]
      last_pos = i
  if(last_pos <= len(lst)-1):
    yield lst[last_pos:]

print([x for x in split(lst)])
a = numpy.array(your original list)
numpy.split(a, numpy.where(numpy.diff(a) < 0)[0] + 1)