按短数字拆分列表
Splitting lists by short numbers
我正在使用 NumPy 在图表上查找交点,但是 isClose
returns 每个交点有多个值
因此,我将尝试找出它们的平均值。但首先,我想隔离相似的值。这也是我觉得有用的技能。
我有一个名为 idx
的交叉点的 x 值列表,看起来像这样
[-8.67735471 -8.63727455 -8.59719439 -5.5511022 -5.51102204 -5.47094188
-5.43086172 -2.4248497 -2.38476954 -2.34468938 -2.30460922 0.74148297
0.78156313 0.82164329 3.86773547 3.90781563 3.94789579 3.98797595
7.03406814 7.0741483 7.11422846]
我想把它分成列表,每个列表都由相似的数字组成。
这是我目前拥有的:
n = 0
for i in range(len(idx)):
try:
if (idx[n]-idx[n-1])<0.5:
sdx.append(idx[n-1])
else:
print(sdx)
sdx = []
except:
sdx.append(idx[n-1])
n = n+1
它在大部分情况下都有效,但它忘记了一些数字:
[-8.6773547094188377, -8.6372745490981959]
[-5.5511022044088181, -5.5110220440881763, -5.4709418837675354]
[-2.4248496993987976, -2.3847695390781567, -2.3446893787575149]
[0.7414829659318638, 0.78156312625250379]
[3.8677354709418825, 3.9078156312625243, 3.9478957915831661]
可能有更有效的方法,有人知道吗?
考虑到你有一个 numpy 数组,你可以使用 np.split,拆分差异 > .5
:
import numpy as np
x = np.array([-8.67735471, -8.63727455, -8.59719439, -5.5511022, -5.51102204, -5.47094188,
-5.43086172, -2.4248497, -2.38476954, -2.34468938, -2.30460922, 0.74148297,
0.78156313, 0.82164329, 3.86773547, 3.90781563, 3.94789579, 3.98797595,
7.03406814, 7.0741483])
print np.split(x, np.where(np.diff(x) > .5)[0] + 1)
[array([-8.67735471, -8.63727455, -8.59719439]), array([-5.5511022 , -5.51102204, -5.47094188, -5.43086172]), array([-2.4248497 , -2.38476954, -2.34468938, -2.30460922]), array([ 0.74148297, 0.78156313, 0.82164329]), array([ 3.86773547, 3.90781563, 3.94789579, 3.98797595]), array([ 7.03406814, 7.0741483 ])]
np.where(np.diff(x) > .5)[0]
returns 后面元素不满足np.diff(x) > .5)
条件的索引:
In [6]: np.where(np.diff(x) > .5)[0]
Out[6]: array([ 2, 6, 10, 13, 17])
+ 1
每个索引加 1:
In [12]: np.where(np.diff(x) > .5)[0] + 1
Out[12]: array([ 3, 7, 11, 14, 18])
然后将[ 3, 7, 11, 14, 18]
传递给np.split将元素拆分为子数组,x[:3], x[3:7],x[7:11] ...
如果您的 最终目的地 正在寻找每个 cluster/group 的平均值,其中每个聚类将被标记为不超过特定阈值的微小差异,您可以使用下面列出的方法。
基本上,我们将输入列表转换为 numpy 数组,对其进行排序,然后找到连续的差异。基于与某个阈值进行比较时的差异,我们为来自同一组的元素创建一个具有相同 ID 的 ID 数组。最后,使用这些 ID,我们使用 np.bincount
在 bin 内进行分箱和平均,基本上得到每个组的平均值。
这是实现 -
import numpy as np
# Input list
AList = [-8.67735471, -8.63727455, -8.59719439, -5.5511022, -5.51102204,
-5.47094188, -5.43086172, -2.4248497, -2.38476954, -2.34468938,
-2.30460922, 0.74148297, 0.78156313, 0.82164329, 3.86773547,
3.90781563, 3.94789579, 3.98797595, 7.03406814, 7.0741483, 7.11422846]
# Tolerance as thresholding parameter to distinguish between two "groups"
tolerance = 1
# Convert to a numpy array and sort if not already sorted
A = np.sort(np.asarray(AList))
# ID array that has the same IDs for elements of the same group
ID_array = (np.append([False],np.diff(A)>tolerance)).cumsum()
# Finally get the average values for each group
average_values = np.bincount(ID_array,A)/np.bincount(ID_array)
样本运行-
In [301]: A
Out[301]:
array([-8.67735471, -8.63727455, -8.59719439, -5.5511022 , -5.51102204,
-5.47094188, -5.43086172, -2.4248497 , -2.38476954, -2.34468938,
-2.30460922, 0.74148297, 0.78156313, 0.82164329, 3.86773547,
3.90781563, 3.94789579, 3.98797595, 7.03406814, 7.0741483 ,
7.11422846])
In [302]: average_values
Out[302]:
array([-8.63727455, -5.49098196, -2.36472946, 0.78156313, 3.92785571,
7.0741483 ])
我正在使用 NumPy 在图表上查找交点,但是 isClose
returns 每个交点有多个值
因此,我将尝试找出它们的平均值。但首先,我想隔离相似的值。这也是我觉得有用的技能。
我有一个名为 idx
的交叉点的 x 值列表,看起来像这样
[-8.67735471 -8.63727455 -8.59719439 -5.5511022 -5.51102204 -5.47094188
-5.43086172 -2.4248497 -2.38476954 -2.34468938 -2.30460922 0.74148297
0.78156313 0.82164329 3.86773547 3.90781563 3.94789579 3.98797595
7.03406814 7.0741483 7.11422846]
我想把它分成列表,每个列表都由相似的数字组成。
这是我目前拥有的:
n = 0
for i in range(len(idx)):
try:
if (idx[n]-idx[n-1])<0.5:
sdx.append(idx[n-1])
else:
print(sdx)
sdx = []
except:
sdx.append(idx[n-1])
n = n+1
它在大部分情况下都有效,但它忘记了一些数字:
[-8.6773547094188377, -8.6372745490981959]
[-5.5511022044088181, -5.5110220440881763, -5.4709418837675354]
[-2.4248496993987976, -2.3847695390781567, -2.3446893787575149]
[0.7414829659318638, 0.78156312625250379]
[3.8677354709418825, 3.9078156312625243, 3.9478957915831661]
可能有更有效的方法,有人知道吗?
考虑到你有一个 numpy 数组,你可以使用 np.split,拆分差异 > .5
:
import numpy as np
x = np.array([-8.67735471, -8.63727455, -8.59719439, -5.5511022, -5.51102204, -5.47094188,
-5.43086172, -2.4248497, -2.38476954, -2.34468938, -2.30460922, 0.74148297,
0.78156313, 0.82164329, 3.86773547, 3.90781563, 3.94789579, 3.98797595,
7.03406814, 7.0741483])
print np.split(x, np.where(np.diff(x) > .5)[0] + 1)
[array([-8.67735471, -8.63727455, -8.59719439]), array([-5.5511022 , -5.51102204, -5.47094188, -5.43086172]), array([-2.4248497 , -2.38476954, -2.34468938, -2.30460922]), array([ 0.74148297, 0.78156313, 0.82164329]), array([ 3.86773547, 3.90781563, 3.94789579, 3.98797595]), array([ 7.03406814, 7.0741483 ])]
np.where(np.diff(x) > .5)[0]
returns 后面元素不满足np.diff(x) > .5)
条件的索引:
In [6]: np.where(np.diff(x) > .5)[0]
Out[6]: array([ 2, 6, 10, 13, 17])
+ 1
每个索引加 1:
In [12]: np.where(np.diff(x) > .5)[0] + 1
Out[12]: array([ 3, 7, 11, 14, 18])
然后将[ 3, 7, 11, 14, 18]
传递给np.split将元素拆分为子数组,x[:3], x[3:7],x[7:11] ...
如果您的 最终目的地 正在寻找每个 cluster/group 的平均值,其中每个聚类将被标记为不超过特定阈值的微小差异,您可以使用下面列出的方法。
基本上,我们将输入列表转换为 numpy 数组,对其进行排序,然后找到连续的差异。基于与某个阈值进行比较时的差异,我们为来自同一组的元素创建一个具有相同 ID 的 ID 数组。最后,使用这些 ID,我们使用 np.bincount
在 bin 内进行分箱和平均,基本上得到每个组的平均值。
这是实现 -
import numpy as np
# Input list
AList = [-8.67735471, -8.63727455, -8.59719439, -5.5511022, -5.51102204,
-5.47094188, -5.43086172, -2.4248497, -2.38476954, -2.34468938,
-2.30460922, 0.74148297, 0.78156313, 0.82164329, 3.86773547,
3.90781563, 3.94789579, 3.98797595, 7.03406814, 7.0741483, 7.11422846]
# Tolerance as thresholding parameter to distinguish between two "groups"
tolerance = 1
# Convert to a numpy array and sort if not already sorted
A = np.sort(np.asarray(AList))
# ID array that has the same IDs for elements of the same group
ID_array = (np.append([False],np.diff(A)>tolerance)).cumsum()
# Finally get the average values for each group
average_values = np.bincount(ID_array,A)/np.bincount(ID_array)
样本运行-
In [301]: A
Out[301]:
array([-8.67735471, -8.63727455, -8.59719439, -5.5511022 , -5.51102204,
-5.47094188, -5.43086172, -2.4248497 , -2.38476954, -2.34468938,
-2.30460922, 0.74148297, 0.78156313, 0.82164329, 3.86773547,
3.90781563, 3.94789579, 3.98797595, 7.03406814, 7.0741483 ,
7.11422846])
In [302]: average_values
Out[302]:
array([-8.63727455, -5.49098196, -2.36472946, 0.78156313, 3.92785571,
7.0741483 ])