flkit 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flkit/__init__.py +2 -0
- flkit/alg/__init__.py +68 -0
- flkit/alg/build_idx.py +9 -0
- flkit/alg/c_track.py +88 -0
- flkit/alg/collierydb.py +1217 -0
- flkit/alg/del2.py +421 -0
- flkit/alg/delaunay_triangulation.py +476 -0
- flkit/alg/finite_plane_distance.py +239 -0
- flkit/alg/get_up_low.py +32 -0
- flkit/alg/in_tin.py +139 -0
- flkit/alg/index.py +9 -0
- flkit/alg/inter/BasePredictor.py +69 -0
- flkit/alg/inter/Kriging.py +226 -0
- flkit/alg/inter/KrigingM.py +262 -0
- flkit/alg/inter/LossFuncs.py +164 -0
- flkit/alg/inter/__init__.py +178 -0
- flkit/alg/inter/idw.py +253 -0
- flkit/alg/inter/midw.py +145 -0
- flkit/alg/inter/nearest_neighbor.py +445 -0
- flkit/alg/inter/rbf.py +345 -0
- flkit/alg/inter/trilinear.py +572 -0
- flkit/alg/point_in_polygon.py +126 -0
- flkit/alg/point_in_volume.py +188 -0
- flkit/alg/point_in_volume_rs.pyi +7 -0
- flkit/alg/point_to_triangle.py +116 -0
- flkit/alg/point_to_triangle_mesh.py +309 -0
- flkit/alg/point_to_triangle_rs.pyi +9 -0
- flkit/alg/rotated_rect.py +184 -0
- flkit/db/__init__.py +17 -0
- flkit/db/db_model.py +724 -0
- flkit/db/duck_model.py +151 -0
- flkit/db/fileobj.py +72 -0
- flkit/db/path_utl.py +174 -0
- flkit/mtcli/__init__.py +18 -0
- flkit/mtcli/core.py +489 -0
- flkit/mtcli/parse.py +218 -0
- flkit/py.typed +0 -0
- flkit/tools/__init__.py +28 -0
- flkit/tools/del_key.py +13 -0
- flkit/tools/dict_to_list.py +10 -0
- flkit/tools/get_region.py +42 -0
- flkit/tools/max_key.py +7 -0
- flkit/tools/mongo.py +119 -0
- flkit/tools/mt_dash.py +121 -0
- flkit/tools/prase_type.py +27 -0
- flkit/typr/Res.py +21 -0
- flkit/typr/__init__.py +107 -0
- flkit/typr/c_grid.py +425 -0
- flkit/typr/console.py +283 -0
- flkit/typr/engine.py +59 -0
- flkit/typr/getenv.py +89 -0
- flkit/typr/result.py +81 -0
- flkit/typr/table.py +34 -0
- flkit/typr/utils.py +542 -0
- flkit/typr/verify.py +64 -0
- flkit/typr/webview.py +219 -0
- flkit/typr/wstask.py +344 -0
- flkit-0.1.0.dist-info/METADATA +186 -0
- flkit-0.1.0.dist-info/RECORD +60 -0
- flkit-0.1.0.dist-info/WHEEL +4 -0
flkit/alg/inter/rbf.py
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
径向基函数插值算法实现
|
|
5
|
+
Radial Basis Function (RBF) Interpolation
|
|
6
|
+
|
|
7
|
+
RBF是一种基于径向基函数的插值方法,具有良好的数学性质。
|
|
8
|
+
支持多种核函数,适用于复杂的非线性插值问题。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
from scipy.interpolate import Rbf
|
|
13
|
+
from scipy.spatial.distance import cdist
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RBF2D:
|
|
17
|
+
"""
|
|
18
|
+
二维径向基函数插值
|
|
19
|
+
|
|
20
|
+
支持多种径向基函数,适用于复杂地形插值
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, function="multiquadric", epsilon=None, smooth=0.0):
|
|
24
|
+
"""
|
|
25
|
+
初始化RBF2D插值器
|
|
26
|
+
|
|
27
|
+
Parameters:
|
|
28
|
+
-----------
|
|
29
|
+
function : str, default='multiquadric'
|
|
30
|
+
径向基函数类型,可选:
|
|
31
|
+
- 'multiquadric': sqrt((r/epsilon)**2 + 1)
|
|
32
|
+
- 'inverse': 1.0/sqrt((r/epsilon)**2 + 1)
|
|
33
|
+
- 'gaussian': exp(-(r/epsilon)**2)
|
|
34
|
+
- 'linear': r
|
|
35
|
+
- 'cubic': r**3
|
|
36
|
+
- 'quintic': r**5
|
|
37
|
+
- 'thin_plate': r**2 * log(r)
|
|
38
|
+
epsilon : float, optional
|
|
39
|
+
形状参数,影响函数的"尖锐度"
|
|
40
|
+
smooth : float, default=0.0
|
|
41
|
+
平滑参数,用于处理噪声数据
|
|
42
|
+
"""
|
|
43
|
+
self.function = function
|
|
44
|
+
self.epsilon = epsilon
|
|
45
|
+
self.smooth = smooth
|
|
46
|
+
self.rbf = None
|
|
47
|
+
|
|
48
|
+
def fit(self, xyzv: np.ndarray):
|
|
49
|
+
"""
|
|
50
|
+
训练RBF模型
|
|
51
|
+
|
|
52
|
+
Parameters:
|
|
53
|
+
-----------
|
|
54
|
+
xyzv : np.ndarray, shape (N, 3)
|
|
55
|
+
已知点数据,每行为 [x, y, z] (对于2D插值,z为插值目标值)
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
--------
|
|
59
|
+
self : RBF2D
|
|
60
|
+
返回自身以支持链式调用
|
|
61
|
+
"""
|
|
62
|
+
xyzv = np.atleast_2d(xyzv)
|
|
63
|
+
if xyzv.shape[1] != 3:
|
|
64
|
+
raise ValueError("输入数据必须是3列:[x, y, z]")
|
|
65
|
+
|
|
66
|
+
self.rbf = Rbf(
|
|
67
|
+
xyzv[:, 0],
|
|
68
|
+
xyzv[:, 1],
|
|
69
|
+
xyzv[:, 2],
|
|
70
|
+
function=self.function,
|
|
71
|
+
epsilon=self.epsilon,
|
|
72
|
+
smooth=self.smooth,
|
|
73
|
+
)
|
|
74
|
+
return self
|
|
75
|
+
|
|
76
|
+
def predict(self, xy: np.ndarray):
|
|
77
|
+
"""
|
|
78
|
+
在指定位置进行插值预测
|
|
79
|
+
|
|
80
|
+
Parameters:
|
|
81
|
+
-----------
|
|
82
|
+
xy : np.ndarray, shape (M, 2) or (2,)
|
|
83
|
+
待插值点的坐标 [x, y]
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
--------
|
|
87
|
+
float or np.ndarray
|
|
88
|
+
- 单点输入 (2,): 返回标量值
|
|
89
|
+
- 多点输入 (M, 2): 返回数组 shape (M,)
|
|
90
|
+
"""
|
|
91
|
+
if self.rbf is None:
|
|
92
|
+
raise ValueError("模型尚未训练,请先调用 fit() 方法")
|
|
93
|
+
|
|
94
|
+
# 检查输入是单点还是多点
|
|
95
|
+
is_single_point = xy.ndim == 1 or (xy.ndim == 2 and xy.shape[0] == 1)
|
|
96
|
+
|
|
97
|
+
xy = np.atleast_2d(xy)
|
|
98
|
+
if xy.shape[1] != 2:
|
|
99
|
+
raise ValueError("预测点坐标必须是2列:[x, y]")
|
|
100
|
+
|
|
101
|
+
z = self.rbf(xy[:, 0], xy[:, 1])
|
|
102
|
+
|
|
103
|
+
# 根据输入类型返回相应格式
|
|
104
|
+
if is_single_point:
|
|
105
|
+
return float(z[0]) # 单点返回标量
|
|
106
|
+
else:
|
|
107
|
+
return z # 多点返回数组
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class RBF3D:
|
|
111
|
+
"""
|
|
112
|
+
三维径向基函数插值
|
|
113
|
+
|
|
114
|
+
支持三维空间中的复杂属性插值
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
def __init__(self, function="multiquadric", epsilon=None, smooth=0.0):
|
|
118
|
+
"""
|
|
119
|
+
初始化RBF3D插值器
|
|
120
|
+
|
|
121
|
+
Parameters:
|
|
122
|
+
-----------
|
|
123
|
+
function : str, default='multiquadric'
|
|
124
|
+
径向基函数类型
|
|
125
|
+
epsilon : float, optional
|
|
126
|
+
形状参数
|
|
127
|
+
smooth : float, default=0.0
|
|
128
|
+
平滑参数
|
|
129
|
+
"""
|
|
130
|
+
self.function = function
|
|
131
|
+
self.epsilon = epsilon
|
|
132
|
+
self.smooth = smooth
|
|
133
|
+
self.rbf = None
|
|
134
|
+
|
|
135
|
+
def fit(self, xyzv: np.ndarray):
|
|
136
|
+
"""
|
|
137
|
+
训练RBF3D模型
|
|
138
|
+
|
|
139
|
+
Parameters:
|
|
140
|
+
-----------
|
|
141
|
+
xyzv : np.ndarray, shape (N, 4)
|
|
142
|
+
已知点数据,每行为 [x, y, z, value]
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
--------
|
|
146
|
+
self : RBF3D
|
|
147
|
+
返回自身以支持链式调用
|
|
148
|
+
"""
|
|
149
|
+
xyzv = np.atleast_2d(xyzv)
|
|
150
|
+
if xyzv.shape[1] != 4:
|
|
151
|
+
raise ValueError("输入数据必须是4列:[x, y, z, value]")
|
|
152
|
+
|
|
153
|
+
self.rbf = Rbf(
|
|
154
|
+
xyzv[:, 0],
|
|
155
|
+
xyzv[:, 1],
|
|
156
|
+
xyzv[:, 2],
|
|
157
|
+
xyzv[:, 3],
|
|
158
|
+
function=self.function,
|
|
159
|
+
epsilon=self.epsilon,
|
|
160
|
+
smooth=self.smooth,
|
|
161
|
+
)
|
|
162
|
+
return self
|
|
163
|
+
|
|
164
|
+
def predict(self, xyz: np.ndarray):
|
|
165
|
+
"""
|
|
166
|
+
在指定位置进行插值预测
|
|
167
|
+
|
|
168
|
+
Parameters:
|
|
169
|
+
-----------
|
|
170
|
+
xyz : np.ndarray, shape (M, 3) or (3,)
|
|
171
|
+
待插值点的坐标 [x, y, z]
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
--------
|
|
175
|
+
float or np.ndarray
|
|
176
|
+
- 单点输入 (3,): 返回标量值
|
|
177
|
+
- 多点输入 (M, 3): 返回数组 shape (M,)
|
|
178
|
+
"""
|
|
179
|
+
if self.rbf is None:
|
|
180
|
+
raise ValueError("模型尚未训练,请先调用 fit() 方法")
|
|
181
|
+
|
|
182
|
+
# 检查输入是单点还是多点
|
|
183
|
+
is_single_point = xyz.ndim == 1 or (xyz.ndim == 2 and xyz.shape[0] == 1)
|
|
184
|
+
|
|
185
|
+
xyz = np.atleast_2d(xyz)
|
|
186
|
+
if xyz.shape[1] != 3:
|
|
187
|
+
raise ValueError("预测点坐标必须是3列:[x, y, z]")
|
|
188
|
+
|
|
189
|
+
v = self.rbf(xyz[:, 0], xyz[:, 1], xyz[:, 2])
|
|
190
|
+
|
|
191
|
+
# 根据输入类型返回相应格式
|
|
192
|
+
if is_single_point:
|
|
193
|
+
return float(v[0]) # 单点返回标量
|
|
194
|
+
else:
|
|
195
|
+
return v # 多点返回数组
|
|
196
|
+
|
|
197
|
+
def predict_grid(self, x_range, y_range, z_range, resolution=None):
|
|
198
|
+
"""
|
|
199
|
+
在规则网格上进行预测
|
|
200
|
+
|
|
201
|
+
Parameters:
|
|
202
|
+
-----------
|
|
203
|
+
x_range : tuple
|
|
204
|
+
x方向的范围 (x_min, x_max)
|
|
205
|
+
y_range : tuple
|
|
206
|
+
y方向的范围 (y_min, y_max)
|
|
207
|
+
z_range : tuple
|
|
208
|
+
z方向的范围 (z_min, z_max)
|
|
209
|
+
resolution : tuple, optional
|
|
210
|
+
网格分辨率 (nx, ny, nz),默认为 (50, 50, 50)
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
--------
|
|
214
|
+
tuple
|
|
215
|
+
(grid_x, grid_y, grid_z, predictions)
|
|
216
|
+
- grid_x, grid_y, grid_z: 网格坐标
|
|
217
|
+
- predictions: 预测值网格
|
|
218
|
+
"""
|
|
219
|
+
if self.rbf is None:
|
|
220
|
+
raise ValueError("模型尚未训练,请先调用 fit() 方法")
|
|
221
|
+
|
|
222
|
+
if resolution is None:
|
|
223
|
+
resolution = (50, 50, 50)
|
|
224
|
+
|
|
225
|
+
# 创建网格
|
|
226
|
+
x = np.linspace(x_range[0], x_range[1], resolution[0])
|
|
227
|
+
y = np.linspace(y_range[0], y_range[1], resolution[1])
|
|
228
|
+
z = np.linspace(z_range[0], z_range[1], resolution[2])
|
|
229
|
+
|
|
230
|
+
grid_x, grid_y, grid_z = np.meshgrid(x, y, z, indexing="ij")
|
|
231
|
+
|
|
232
|
+
# 直接使用网格进行预测
|
|
233
|
+
predictions = self.rbf(grid_x, grid_y, grid_z)
|
|
234
|
+
|
|
235
|
+
return grid_x, grid_y, grid_z, predictions
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class CustomRBF:
|
|
239
|
+
"""
|
|
240
|
+
自定义径向基函数插值器
|
|
241
|
+
|
|
242
|
+
允许用户定义自己的径向基函数
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def __init__(self, rbf_function, epsilon=1.0):
|
|
246
|
+
"""
|
|
247
|
+
初始化自定义RBF插值器
|
|
248
|
+
|
|
249
|
+
Parameters:
|
|
250
|
+
-----------
|
|
251
|
+
rbf_function : callable
|
|
252
|
+
径向基函数,接受距离r作为参数
|
|
253
|
+
epsilon : float, default=1.0
|
|
254
|
+
形状参数
|
|
255
|
+
"""
|
|
256
|
+
self.rbf_function = rbf_function
|
|
257
|
+
self.epsilon = epsilon
|
|
258
|
+
self.points = None
|
|
259
|
+
self.values = None
|
|
260
|
+
self.weights = None
|
|
261
|
+
|
|
262
|
+
def fit(self, xyzv: np.ndarray):
|
|
263
|
+
"""
|
|
264
|
+
训练自定义RBF模型
|
|
265
|
+
|
|
266
|
+
Parameters:
|
|
267
|
+
-----------
|
|
268
|
+
xyzv : np.ndarray, shape (N, D+1)
|
|
269
|
+
已知点数据,前D列为坐标,最后一列为值
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
--------
|
|
273
|
+
self : CustomRBF
|
|
274
|
+
返回自身以支持链式调用
|
|
275
|
+
"""
|
|
276
|
+
xyzv = np.atleast_2d(xyzv)
|
|
277
|
+
if xyzv.shape[1] < 2:
|
|
278
|
+
raise ValueError("输入数据至少需要2列:[坐标..., value]")
|
|
279
|
+
|
|
280
|
+
self.points = xyzv[:, :-1] # 前面的列为坐标
|
|
281
|
+
self.values = xyzv[:, -1] # 最后一列为值
|
|
282
|
+
|
|
283
|
+
# 计算距离矩阵
|
|
284
|
+
distances = cdist(self.points, self.points)
|
|
285
|
+
|
|
286
|
+
# 构建RBF矩阵
|
|
287
|
+
rbf_matrix = self.rbf_function(distances / self.epsilon)
|
|
288
|
+
|
|
289
|
+
# 求解权重
|
|
290
|
+
self.weights = np.linalg.solve(rbf_matrix, self.values)
|
|
291
|
+
|
|
292
|
+
return self
|
|
293
|
+
|
|
294
|
+
def predict(self, query_points: np.ndarray) -> np.ndarray:
|
|
295
|
+
"""
|
|
296
|
+
在指定位置进行插值预测
|
|
297
|
+
|
|
298
|
+
Parameters:
|
|
299
|
+
-----------
|
|
300
|
+
query_points : np.ndarray, shape (M, D)
|
|
301
|
+
查询点坐标
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
--------
|
|
305
|
+
np.ndarray, shape (M,)
|
|
306
|
+
插值结果
|
|
307
|
+
"""
|
|
308
|
+
if self.weights is None:
|
|
309
|
+
raise ValueError("模型尚未训练,请先调用 fit() 方法")
|
|
310
|
+
|
|
311
|
+
query_points = np.atleast_2d(query_points)
|
|
312
|
+
|
|
313
|
+
# 计算查询点到已知点的距离
|
|
314
|
+
distances = cdist(query_points, self.points)
|
|
315
|
+
|
|
316
|
+
# 计算RBF值
|
|
317
|
+
rbf_values = self.rbf_function(distances / self.epsilon)
|
|
318
|
+
|
|
319
|
+
# 加权求和
|
|
320
|
+
predictions = np.dot(rbf_values, self.weights)
|
|
321
|
+
|
|
322
|
+
return predictions.squeeze() if predictions.shape[0] == 1 else predictions
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
# 预定义的径向基函数
|
|
326
|
+
def gaussian_rbf(r):
|
|
327
|
+
"""高斯径向基函数"""
|
|
328
|
+
return np.exp(-(r**2))
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def multiquadric_rbf(r):
|
|
332
|
+
"""多二次径向基函数"""
|
|
333
|
+
return np.sqrt(1 + r**2)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def inverse_multiquadric_rbf(r):
|
|
337
|
+
"""逆多二次径向基函数"""
|
|
338
|
+
return 1.0 / np.sqrt(1 + r**2)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def thin_plate_spline_rbf(r):
|
|
342
|
+
"""薄板样条径向基函数"""
|
|
343
|
+
# 避免log(0)
|
|
344
|
+
r = np.maximum(r, 1e-10)
|
|
345
|
+
return r**2 * np.log(r)
|