gpt4 book ai didi

python - np.meshgrid 部分中的标签点

转载 作者:行者123 更新时间:2023-12-04 14:56:53 27 4
gpt4 key购买 nike

我正在尝试根据 x 和 y 点在 python 中网格的特定部分中的位置来标记它们。这些点存储在 Pandas 数据框中。

这里我有一个坐标散点图,在它们上方我正在绘制网格。整个网格更大,从左下点(500,1250)到右上点(2750, 3250),这意味着整个网格是 225x200 个部分。

enter image description here

我想遍历网格的各个部分并检查是否有一个点在里面。如果一个点在我想为该点添加标签的部分内。标签应与节名相同。我想在名为“section”的数据框中添加一列,用于存储一个点所属的部分。

在示例(上图)中,我想用770 <= x <= 780 和 1795 <= y <= 1805,部分名称为“A3”。

我的代码目前看起来像这样:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection


df = pd.read_csv('./file.csv', sep=';')

x_min = df['X[mm]'].min()
x_max = df['X[mm]'].max()
y_min = df['Y[mm]'].min()
y_max = df['Y[mm]'].max()
#side of the square in mm:
square_side = 10

xs = np.arange(x_min, x_max+square_side, square_side)
ys = np.arange(y_min, y_max+square_side, square_side)
x_2, y_2 = np.meshgrid(xs, ys, indexing = 'ij')


fig, ax = plt.subplots(figsize=(9,9))
ax.plot(df['X[mm]'], df['Y[mm]'], linewidth=0.2, c='black')

#plot meshgrid as grid instead of points:
segs1 = np.stack((x_2[:,[0,-1]],y_2[:,[0,-1]]), axis=2)
segs2 = np.stack((x_2[[0,-1],:].T,y_2[[0,-1],:].T), axis=2)
plt.gca().add_collection(LineCollection(np.concatenate((segs1, segs2))))

ax.set_aspect('equal', 'box')
plt.show()

我还有一个函数可以确定点是否在矩形内(这不使用 meshgrid):

def is_inside_rect(M, A, B, D):
'''Check if a point M is inside a rectangle with corners A, B, C, D'''
# 0 <= dot(BC,BM) <= dot(BC,BC)
#print(np.dot(B - A, D - A))
return 0 <= np.dot(B - A, M - A) <= np.dot(B - A, B - A) and 0 <= np.dot(D - B, M - B) <= np.dot(D - B, D - B)

我想像这样在 while 循环中使用它:

x = x_min
y = y_min

while (x <= x_max + square_side) and (y <= y_max + square_side):
A = np.array([x, y])
B = np.array([x + square_side, y])
D = np.array([x + square_side, y + square_side])

print(A, B, D)
df['c'] = df[['X[mm]', 'Y[mm]']].apply(lambda coord: 'red' if is_inside_rect(np.array(coord), A, B, D) else 'black', axis=1)
x += square_side
y += square_side

但这非常慢,并且每次迭代都会更改所有点的颜色。

最佳答案

由于所有点的大小都相同,因此无需事先定义所有正方形,然后再确定哪些正方形有哪些点。我会使用每个点的坐标来直接确定它将落在哪个方 block 上。

为了简单起见,让我们以一维为例。您想要将数轴上的点分组为“正方形”(实际上是一维线段)。如果您的第一个方 block 从 x=0 开始,第二个方 block 从 x=10 开始,第三个方 block 从 x=20 开始,依此类推,您如何找到任意点 x 的方 block ?您知道正方形的间距为 10(并且您知道它们从 0 开始,这使事情变得更容易),因此您可以简单地除以 10 并向下取整以获得正方形索引。

您可以在 3 维(或 n 维)中轻松地做同样的事情。

square_side = 10
x_min = df['X[mm]'].min()
y_min = df['Y[mm]'].min()

def label_point(x, y):
# Double forward slash is integer (round down) division
# Add 1 here if you really want 1-based indexing
x_label = (x - x_min) // square_side

y_label = chr(ord('A') + (y - y_min) // square_side)

return f'{y_label}{x_label}'

df['label'] = df[['X[mm]', 'Y[mm]']].apply(lambda coord: label_point(*coord), axis=1)

至于效率,这个解决方案只查看每个点一次,并对每个点做恒定量的工作,所以它的点数是 O(n)。您的解决方案查看每个方 block 一次,对于每个方 block 查看每个点,这是 O(n × m),其中 n 是点的数量,m 是方 block 的数量。

您的解决方案更为通用,因为您的 is_inside_rect 函数在您的矩形网格具有任意旋转时起作用。在这种情况下,我建议围绕原点旋转所有点,然后运行我的解决方案。

此外,您的循环在每个循环中将 x 和 y 加 10,因此您是沿对角线遍历空间。我认为你不是故意的。

关于python - np.meshgrid 部分中的标签点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67802251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com