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