python 聚类,
从小到大排序,返回小的完整索引。
def find_contiguous_indices(mask_all, max_gap=3):
segments = []
n = len(mask_all)
i = 0
while i < n:
if mask_all[i]:
start = i
while i < n and mask_all[i]:
i += 1
end = i - 1
segments.append((start, end))
else:
i += 1
if not segments:
return np.array([], dtype=int) # 如果没有 True,返回空数组
merged_segments = [segments[0]]
for current in segments[1:]:
last = merged_segments[-1]
if current[0] - last[1] - 1 < max_gap:
merged_segments[-1] = (last[0], current[1]) # 合并
else:
merged_segments.append(current)
indices = []
for start, end in merged_segments:
indices.append([i for i in range(start, end + 1)]) # 添加该段所有索引
return indices
best_k = 5 # 通过肘部法则或轮廓系数确定,此处简化为已知值
# 执行KMeans++聚类
kmeans = KMeans(n_clusters=best_k, init='k-means++', n_init=10)
labels = kmeans.fit_predict(speeds.reshape(-1, 1))
# unique_labels = np.unique(labels)
centers_flattened=kmeans.cluster_centers_.flatten()
# 按聚类中心从大到小排序
sorted_indices = np.argsort(centers_flattened)
mask_all = np.zeros_like(labels, dtype=bool)
for idx in sorted_indices:
mask = (labels == idx)
mask_all |= mask # 等价于 mask_all = mask_all | mask
if np.sum(mask_all == True)>len(pose_3d)*0.15 and centers_flattened[idx]>1600:
break
low_frame_ids=find_contiguous_indices(mask_all)