Python 将浮点数列表分组为近数,考虑其在np数组中的近位置

Python 将浮点数列表分组为近数,考虑其在np数组中的近位置,python,arrays,numpy,Python,Arrays,Numpy,我读了这篇文章并适应了我的目的。我想把浮点数和它们的近似数分组。相邻数字之间的间隔应小于1,但组中的第一个和最后一个数字可以大于1 无法对数组进行排序。如果两个值之间的差值小于1,但它们在数组中的位置彼此相差很远,则它们必须位于不同的组中 我从这个代码中得到了错误的结果 d = np.array([[100.1,100.6,101.1,500,500.3,500.6,500.9,44.1,44.2,101.9,102.1],[40,41]]) ans = [] for i in range(d

我读了这篇文章并适应了我的目的。我想把浮点数和它们的近似数分组。相邻数字之间的间隔应小于1,但组中的第一个和最后一个数字可以大于1

无法对数组进行排序。如果两个值之间的差值小于1,但它们在数组中的位置彼此相差很远,则它们必须位于不同的组中

我从这个代码中得到了错误的结果

d = np.array([[100.1,100.6,101.1,500,500.3,500.6,500.9,44.1,44.2,101.9,102.1],[40,41]])

ans = []
for i in range(d.size):     
    m = [[d[i][0]]]     
    for x in d[i][1:]:
        if x - m[-1][0] < 1:
            m[-1].append(x)
        else:
            m.append([x])
    ans.append(m)
print ans
>>[[[100.1, 100.6], [101.1], [500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1]], [[40], [41]]]

我在这里做错了什么?

如果您愿意接受另一种更有效的解决方案,这里有一个使用NumPy的解决方案-

样本运行-

In [83]: d
Out[83]: 
array([[100.1, 100.6, 101.1, 500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1],
       [40, 41]], dtype=object)

In [84]: [np.split(i, np.flatnonzero(np.abs(np.diff(i))>=1)+1) for i in d]
Out[84]: 
[[array([ 100.1,  100.6,  101.1]),
  array([ 500. ,  500.3,  500.6,  500.9]),
  array([ 44.1,  44.2]),
  array([ 101.9,  102.1])],
 [array([40]), array([41])]]

如果您愿意使用另一种更有效的解决方案,这里有一个使用NumPy的解决方案-

样本运行-

In [83]: d
Out[83]: 
array([[100.1, 100.6, 101.1, 500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1],
       [40, 41]], dtype=object)

In [84]: [np.split(i, np.flatnonzero(np.abs(np.diff(i))>=1)+1) for i in d]
Out[84]: 
[[array([ 100.1,  100.6,  101.1]),
  array([ 500. ,  500.3,  500.6,  500.9]),
  array([ 44.1,  44.2]),
  array([ 101.9,  102.1])],
 [array([40]), array([41])]]

提示:
np.sort
,一旦
d
排序,实现算法应该更加简单高效:)提示:
np.sort
,一旦
d
排序,实现算法应该更加简单高效:)这太棒了!非常感谢你。只是想知道有没有一种方法可以得到每个数组的大小?现在
len(输出)
为2。我正在寻找类似于
(array1,4)、(array2,2)
@Jan
列表(map(len,out))
,其中
out
是建议解决方案的输出。这太棒了!非常感谢你。只是想知道有没有一种方法可以得到每个数组的大小?现在
len(输出)
为2。我正在寻找类似于
(array1,4)、(array2,2)
@Jan
列表(map(len,out))
,其中
out
是建议解决方案的输出。
In [83]: d
Out[83]: 
array([[100.1, 100.6, 101.1, 500, 500.3, 500.6, 500.9, 44.1, 44.2, 101.9, 102.1],
       [40, 41]], dtype=object)

In [84]: [np.split(i, np.flatnonzero(np.abs(np.diff(i))>=1)+1) for i in d]
Out[84]: 
[[array([ 100.1,  100.6,  101.1]),
  array([ 500. ,  500.3,  500.6,  500.9]),
  array([ 44.1,  44.2]),
  array([ 101.9,  102.1])],
 [array([40]), array([41])]]