Python scipy кластеризация
Столкнулся с такой проблемой, есть массив точек как на картинке, как я могу кластеризовать его и посчитать количество отдельных объектов в моём массиве? В данном случае хочу увидеть цифру 3
Раньше использовал вот такой вот код, но на этом массиве он считает каждую точку как отдельный объект, как я могу настроить чувствительность кластеризации в scipy?
from scipy import ndimage
list_coord_a = np.array(list_coord)
h = 0.00001
arr = (list_coord_a + 1) / h
list_coord_a = np.int64(arr)
map_a = list_coord_a[:, :2]
min_value = np.min(map_a, axis=0)
map_a = map_a - min_value
image = np.zeros(np.max(map_a, axis=0) + 1, dtype=np.int32)
image[map_a[:, 0], map_a[:, 1]] = 1
label, n = ndimage.label(image, structure=np.ones((3, 3)))
Часть массива из 7000 точек:
[0.0789702838086786, 0.026726748654913795, -0.33899998664855957]
[0.07952999876630526, 0.026726748654913795, -0.33899998664855957]
[0.07985346391344544, 0.02664790970030836, -0.33799999952316284]
[0.0809695917179403, 0.02664790970030836, -0.33799999952316284]
[0.0789702838086786, 0.026166138141604005, -0.33899998664855957]
[0.07929540001119802, 0.026088952884101083, -0.33799999952316284]
[0.02954005788482236, -0.10495446536302219, -0.3370000123977661]
[0.0301857766134246, -0.10526589892460925, -0.33799999952316284]
[0.030652883578558728, -0.10495446536302219, -0.3370000123977661]
[0.03677342489410876, -0.10495446536302219, -0.3370000123977661]
[0.02635707779177199, -0.1061379429995061, -0.33899998664855957]
[0.03297609612466172, -0.10638381255702381, -0.33799999952316284]
[0.03343494781289965, -0.10606907160123173, -0.3370000123977661]
upd 13:38 23.06
"u235" помог написал скрипт, который строит триангулированые сетки по входным данным:
import matplotlib.pyplot as plt
import matplotlib.tri as tri
t = np.array(t)
points = t[:, :2]
x = points[:, 0]
y = points[:, 1]
triang = tri.Triangulation(x, y)
fig1, ax1 = plt.subplots()
ax1.set_aspect('equal')
max_radius = 0.02
triangles = triang.triangles
xtri = x[triangles] - np.roll(x[triangles], 1, axis=1)
ytri = y[triangles] - np.roll(y[triangles], 1, axis=1)
maxi = np.max(np.sqrt(xtri ** 2 + ytri ** 2), axis=1)
triang.set_mask(maxi > max_radius)
ax1.triplot(triang, color="red")
plt.show()
Ответы (1 шт):
Автор решения: Alex Alex
→ Ссылка
Собственно решение состоит в триангуляции набора точек, удалении треугольников с длинными ребрами и поиска связных компонент графа.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.tri import Triangulation
from scipy.sparse.csgraph import connected_components
from scipy.sparse import csr_matrix
coord = [[0.0789702838086786, 0.026726748654913795, -0.33899998664855957],
[0.07952999876630526, 0.026726748654913795, -0.33899998664855957],
[0.07985346391344544, 0.02664790970030836, -0.33799999952316284],
[0.08041152781569287, 0.02664790970030836, -0.33799999952316284],
[0.0809695917179403, 0.02664790970030836, -0.33799999952316284],
[0.0789702838086786, 0.026166138141604005, -0.33899998664855957],
[0.07929540001119802, 0.026088952884101083, -0.33799999952316284],
[0.07961721410295897, 0.02601176762659816, -0.3370000123977661],
[0.08017362694982716, 0.02601176762659816, -0.3370000123977661],
[0.08049048073615488, 0.025934580068765693, -0.335999995470047],
[0.0810452424784379, 0.025934580068765693, -0.335999995470047],
[0.08160000422072093, 0.025934580068765693, -0.335999995470047],
[0.07929540001119802, 0.025529996067893804, -0.33799999952316284],
[0.07961721410295897, 0.025454464507493394, -0.3370000123977661],
[0.08017362694982716, 0.025454464507493394, -0.3370000123977661],
[0.08049048073615488, 0.025378930696048088, -0.335999995470047],
[0.0810452424784379, 0.025378930696048088, -0.335999995470047],
[0.08160000422072093, 0.025378930696048088, -0.335999995470047],
[0.025088755109876883, -0.10439716224391743, -0.3370000123977661],
[0.02564516795674507, -0.10439716224391743, -0.3370000123977661],
[0.02620158080361325, -0.10439716224391743, -0.3370000123977661],
[0.026757993650481437, -0.10439716224391743, -0.3370000123977661],
[0.02731440649734962, -0.10439716224391743, -0.3370000123977661],
[0.027870819344217805, -0.10439716224391743, -0.3370000123977661],
[0.02842723219108599, -0.10439716224391743, -0.3370000123977661],
[0.028983645037954173, -0.10439716224391743, -0.3370000123977661],
[0.02954005788482236, -0.10439716224391743, -0.3370000123977661],
[0.030096470731690545, -0.10439716224391743, -0.3370000123977661],
[0.030652883578558728, -0.10439716224391743, -0.3370000123977661],
[0.031209296425426913, -0.10439716224391743, -0.3370000123977661],
[0.0317657092722951, -0.10439716224391743, -0.3370000123977661],
[0.032322122119163285, -0.10439716224391743, -0.3370000123977661],
[0.032878534966031464, -0.10439716224391743, -0.3370000123977661],
[0.03343494781289965, -0.10439716224391743, -0.3370000123977661],
[0.033991360659767836, -0.10439716224391743, -0.3370000123977661],
[0.03454777350663602, -0.10439716224391743, -0.3370000123977661],
[0.03510418635350421, -0.10439716224391743, -0.3370000123977661],
[0.035660599200372387, -0.10439716224391743, -0.3370000123977661],
[0.03621701204724057, -0.10439716224391743, -0.3370000123977661],
[0.03677342489410876, -0.10439716224391743, -0.3370000123977661],
[0.037329837740976944, -0.10439716224391743, -0.3370000123977661],
[0.03788625058784513, -0.10439716224391743, -0.3370000123977661],
[0.02635707779177199, -0.10557733248619632, -0.33899998664855957],
[0.026916792749398656, -0.10557733248619632, -0.33899998664855957],
[0.027395457102187472, -0.10526589892460925, -0.33799999952316284],
[0.0279535210044349, -0.10526589892460925, -0.33799999952316284],
[0.028511584906682323, -0.10526589892460925, -0.33799999952316284],
[0.028983645037954173, -0.10495446536302219, -0.3370000123977661],
[0.02954005788482236, -0.10495446536302219, -0.3370000123977661],
[0.0301857766134246, -0.10526589892460925, -0.33799999952316284],
[0.030652883578558728, -0.10495446536302219, -0.3370000123977661],
[0.031209296425426913, -0.10495446536302219, -0.3370000123977661],
[0.0317657092722951, -0.10495446536302219, -0.3370000123977661],
[0.032322122119163285, -0.10495446536302219, -0.3370000123977661],
[0.032878534966031464, -0.10495446536302219, -0.3370000123977661],
[0.03343494781289965, -0.10495446536302219, -0.3370000123977661],
[0.033991360659767836, -0.10495446536302219, -0.3370000123977661],
[0.03454777350663602, -0.10495446536302219, -0.3370000123977661],
[0.03510418635350421, -0.10495446536302219, -0.3370000123977661],
[0.035660599200372387, -0.10495446536302219, -0.3370000123977661],
[0.03621701204724057, -0.10495446536302219, -0.3370000123977661],
[0.03677342489410876, -0.10495446536302219, -0.3370000123977661],
[0.02635707779177199, -0.1061379429995061, -0.33899998664855957],
[0.026916792749398656, -0.1061379429995061, -0.33899998664855957],
[0.027395457102187472, -0.10582485574081653, -0.33799999952316284],
[0.0279535210044349, -0.10582485574081653, -0.33799999952316284],
[0.028511584906682323, -0.10582485574081653, -0.33799999952316284],
[0.028983645037954173, -0.10551176848212696, -0.3370000123977661],
[0.02954005788482236, -0.10551176848212696, -0.3370000123977661],
[0.0301857766134246, -0.10582485574081653, -0.33799999952316284],
[0.030652883578558728, -0.10551176848212696, -0.3370000123977661],
[0.031209296425426913, -0.10551176848212696, -0.3370000123977661],
[0.0317657092722951, -0.10551176848212696, -0.3370000123977661],
[0.032322122119163285, -0.10551176848212696, -0.3370000123977661],
[0.032878534966031464, -0.10551176848212696, -0.3370000123977661],
[0.03343494781289965, -0.10551176848212696, -0.3370000123977661],
[0.033991360659767836, -0.10551176848212696, -0.3370000123977661],
[0.03454777350663602, -0.10551176848212696, -0.3370000123977661],
[0.03510418635350421, -0.10551176848212696, -0.3370000123977661],
[0.035660599200372387, -0.10551176848212696, -0.3370000123977661],
[0.03621701204724057, -0.10551176848212696, -0.3370000123977661],
[0.03677342489410876, -0.10551176848212696, -0.3370000123977661],
[0.030743840515672024, -0.10638381255702381, -0.33799999952316284],
[0.03130190441791945, -0.10638381255702381, -0.33799999952316284],
[0.031859968320166875, -0.10638381255702381, -0.33799999952316284],
[0.0324180322224143, -0.10638381255702381, -0.33799999952316284],
[0.03297609612466172, -0.10638381255702381, -0.33799999952316284],
[0.03343494781289965, -0.10606907160123173, -0.3370000123977661],
[0.033991360659767836, -0.10606907160123173, -0.3370000123977661],
[0.03454777350663602, -0.10606907160123173, -0.3370000123977661],
[0.03510418635350421, -0.10606907160123173, -0.3370000123977661]]
coord = np.array(coord)
points = coord[:, :2]
x = points[:, 0]
y = points[:, 1]
triang = Triangulation(points[:, 0], points[:, 1]) # триангуляция набора точек
max_radius = 0.02 # максимальное расстояние, cut off
triangles = triang.triangles
xtri = x[triangles] - np.roll(x[triangles], 1, axis=1)
ytri = y[triangles] - np.roll(y[triangles], 1, axis=1)
# максимальная длина стороны треугольника
maxi = np.max(np.sqrt(xtri**2 + ytri**2), axis=1)
triang.set_mask(maxi > max_radius) # фильтрация треугольников по длине стороны
num_nodes = np.max(triang.edges)+1 # число вершин
graph = csr_matrix((np.ones(triang.edges.shape[0]), (
triang.edges[:, 0], triang.edges[:, 1])), shape=(num_nodes, num_nodes))
n, labels = connected_components(graph.toarray(), directed=False)
fig1, ax1 = plt.subplots()
ax1.set_aspect('equal')
for i in range(n):
ax1.scatter(coord[labels == i, 0], coord[labels == i, 1], s=0.5)
print(f'Компонент {i}: ')
print(coord[labels == i])
plt.show()



