我必须对NumPy数组中的连续元素进行聚类。考虑以下示例
a = [ 0, 47, 48, 49, 50, 97, 98, 99]
输出应为元组列表,如下所示
[(0), (47, 48, 49, 50), (97, 98, 99)]
在这里,差异只是元素之间的差异。如果差异也可以指定为限制或硬编码数字,那就太好了。
我必须对NumPy数组中的连续元素进行聚类。考虑以下示例
a = [ 0, 47, 48, 49, 50, 97, 98, 99]
输出应为元组列表,如下所示
[(0), (47, 48, 49, 50), (97, 98, 99)]
在这里,差异只是元素之间的差异。如果差异也可以指定为限制或硬编码数字,那就太好了。
Answers:
这是一个可能有用的lil函数:
def group_consecutives(vals, step=1):
"""Return list of consecutive lists of numbers from vals (number list)."""
run = []
result = [run]
expect = None
for v in vals:
if (v == expect) or (expect is None):
run.append(v)
else:
run = [v]
result.append(run)
expect = v + step
return result
>>> group_consecutives(a)
[[0], [47, 48, 49, 50], [97, 98, 99]]
>>> group_consecutives(a, step=47)
[[0, 47], [48], [49], [50, 97], [98], [99]]
PS这是纯Python。有关NumPy的解决方案,请参见unutbu的答案。
tuple(map(tuple, group_consecutives(a)))
np.split
。
def consecutive(data, stepsize=1):
return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)
a = np.array([0, 47, 48, 49, 50, 97, 98, 99])
consecutive(a)
产量
[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]
partitions = np.where(a[1:] != a[:-1])[0] + 1
np.diff
np.split(np.r_[:len(data)], np.where(np.diff(data) != stepsize)[0]+1)
连续的索引列表,那么如果data
是大表的一列,则可以使用该结果来索引相同的行组。
(a[1:]-a[:-1])==1
将产生一个布尔数组,其中False
指示运行中断。您还可以使用内置的numpy.grad。
a
在这种情况下,它是一个numpy数组,而不是列表,并且减号运算符进行逐元素减法。
这是我到目前为止提出的:不确定100%正确
import numpy as np
a = np.array([ 0, 47, 48, 49, 50, 97, 98, 99])
print np.split(a, np.cumsum( np.where(a[1:] - a[:-1] > 1) )+1)
返回:
>>>[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]
这听起来有点像作业,所以如果您不介意我会建议一种方法
您可以使用遍历列表
for i in range(len(a)):
print a[i]
您可以测试列表中的下一个元素是否符合某些条件,如下所示
if a[i] == a[i] + 1:
print "it must be a consecutive run"
您可以将结果分别存储在
results = []
当心-上面隐藏着一个索引超出范围错误,您需要处理