数据帧格式:
<表类>
tooth_id
x_center
y_center
宽度高度象限 tbody><<tr>1 0.309643 0.082520 0.072325 0.169476 2-0.211200 -0.057675 0.071321 0.199645 3 -0.307634 -0.127773 0.081366 0.187223 4-0.262933 -0.093611 0.065294 0.211180 50.253139 0.136646 0.096936 0.190772 表类>
解决方案
这是另一个解决方案,使用arctan2
和一些模运算。请注意,Corralien的方法更加一般化。下面的内容是非常特定于这个用例的。
import numpy as np
deg = np.round(180 * np.arctan2(df.y_center, df.x_center) / np.pi).astype(int)
df["quadrant"] = 1 + ((deg + 360) % 360) // 90
输出:
>>> df
tooth_id x_center y_center width height quadrant
0 1 0.309643 0.082520 0.072325 0.169476 1
1 2 -0.211200 -0.057675 0.071321 0.199645 3
2 3 -0.307634 -0.127773 0.081366 0.187223 3
3 4 -0.262933 -0.093611 0.065294 0.211180 3
4 5 0.253139 0.136646 0.096936 0.190772 1
注意,坐标轴上的点是"滚动"的。沿逆时针方向进入相邻象限,例如,位于90°的(0, 0.631)
点被认为是象限2;位于180°的(-0.578, 0)
为象限3,以此类推
步骤用np.arctan2()
求(x, y)
各点形成的角度(度):
>>> deg = np.round(180 * np.arctan2(df.y_center, df.x_center) / np.pi).astype(int)
>>> deg
0 15
1 -165
2 -157
3 -160
4 28
dtype: int32
现在,将(-180°, 180°]
转换为[0°, 360°)
:
>>> deg = (deg + 360) % 360
>>> deg
0 15
1 195
2 203
3 200
4 28
dtype: int32
地板除以90得到象限(它将返回0,1,2,3——所以也加1):
>>> quadrant = 1 + (deg // 90)
>>> quadrant
0 1
1 3
2 3
3 3
4 1
dtype: int32
使用np.select
:
# Update: change 'df.x_center > 0' to 'df.x_center >= 0'
# See comment of @ddejohn below
df['quadrant'] = np.select([(df.x_center >= 0) & (df.y_center >= 0),
(df.x_center < 0) & (df.y_center >= 0),
(df.x_center < 0) & (df.y_center < 0),
(df.x_center >= 0) & (df.y_center < 0)],
choicelist=[1, 2, 3, 4])
输出:
>>> df
tooth_id x_center y_center width height quadrant
0 1 0.309643 0.082520 0.072325 0.169476 1
1 2 -0.211200 -0.057675 0.071321 0.199645 3
2 3 -0.307634 -0.127773 0.081366 0.187223 3
3 4 -0.262933 -0.093611 0.065294 0.211180 3
4 5 0.253139 0.136646 0.096936 0.190772 1