python3 如何过滤如图座标?

作者站长头像
站长
· 阅读数 6

python3 如何过滤如图座标?

如图,点的座标已知,如何过滤出松散的点呢?

就是我只想要每个正方形内只有1到2个点的点。

我能想到用循环遍历比较出来,有什么高效的方案吗?谢谢

点数据参考:[ (12, 562), (759, 526), ...]

请不要用numpy以外的工具,blender插件用的,只支持numpy,谢谢

import random

print("#"*55)

verts = []
axis_x = []
axis_y = []

# 数据量万级
for i in range(10000):    
    x = random.randint(0,999)
    y = random.randint(0,999)
    axis_x.append(x)
    axis_y.append(y)
    verts.append( (x, y) )
x_d = max(axis_x)
y_d = max(axis_y)


data = {}

x_c = (x_d // 100) + 1
y_c = (y_d // 100) + 1
for y in range(y_c):
    for x in range(x_c):
        data[(x, y)] = []

for v in verts:
    x = v[0] // 100
    y = v[1] // 100
    k = (x,y)
    if k in data:
        data[k].append(v)


for v in data.values():
    if len(v) in [1,2]:
        print(v)
        

以上代码可用,但怎么实现更高效的方法?

回复
1个回答
avatar
test
2024-06-29
import random
import collections
import matplotlib.pyplot as plt

# 数据量万级
n = 10000

# 随机生成点
points = [(random.randint(0,999), random.randint(0,999)) for _ in range(n)]

# 调整桶的大小为10x10
buckets = collections.defaultdict(lambda: collections.defaultdict(list))

# 分配点到桶
for point in points:
    x, y = point
    buckets[x // 10][y // 10].append(point)

# 过滤桶
filtered_points = []
for bucket in buckets.values():
    for points in bucket.values():
        if 1 <= len(points) <= 2:
            filtered_points.extend(points)

# 提取 x, y 坐标
x_values, y_values = zip(*filtered_points)

# 创建一个新的图表
plt.figure(figsize=(10, 10))

# 绘制点
plt.scatter(x_values, y_values, s=5)

# 设置图表的标题和坐标轴标签
plt.title('Filtered Points')
plt.xlabel('X')
plt.ylabel('Y')

# 显示图表
plt.show()

输出:
([(464, 825),
  (467, 892),
  (469, 849),
  (465, 843),
  (464, 851),
  (469, 863),
  (462, 862),
  (468, 870),
  (461, 886),
  (476, 895)],
 80)

answer image

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容