Python 将浮点数列表分组为近数,考虑其在np数组中的近位置
我读了这篇文章并适应了我的目的。我想把浮点数和它们的近似数分组。相邻数字之间的间隔应小于1,但组中的第一个和最后一个数字可以大于1 无法对数组进行排序。如果两个值之间的差值小于1,但它们在数组中的位置彼此相差很远,则它们必须位于不同的组中 我从这个代码中得到了错误的结果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
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])]]