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/get_up_low.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
def get_up_low(target, data, label="value"):
|
|
2
|
+
"""
|
|
3
|
+
二分查找目标值在有序数据中的上下界。
|
|
4
|
+
"""
|
|
5
|
+
# 检查目标值是否在数据范围内
|
|
6
|
+
if target[label] < data[0][label]:
|
|
7
|
+
return (None, data[0])
|
|
8
|
+
if target[label] > data[-1][label]:
|
|
9
|
+
return (data[-1], None)
|
|
10
|
+
|
|
11
|
+
# 按照label升序排序
|
|
12
|
+
data = sorted(data, key=lambda x: x[label])
|
|
13
|
+
|
|
14
|
+
for idx, item in enumerate(data[:-1]):
|
|
15
|
+
if item[label] <= target[label] <= data[idx + 1][label]:
|
|
16
|
+
return (item, data[idx + 1])
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def linear_interpolation(target, up, low, scale="value", labels=("x", "y", "z")):
|
|
20
|
+
"""
|
|
21
|
+
线性插值计算目标值在有序数据中的上下界。
|
|
22
|
+
"""
|
|
23
|
+
if up is None or low is None:
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
weight = (target[scale] - up[scale]) / (low[scale] - up[scale])
|
|
27
|
+
|
|
28
|
+
results = []
|
|
29
|
+
for label in labels:
|
|
30
|
+
results.append(up[label] + weight * (low[label] - up[label]))
|
|
31
|
+
|
|
32
|
+
return tuple(results)
|
flkit/alg/in_tin.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def point_to_triangle_distance(P, A, B, C):
|
|
5
|
+
"""
|
|
6
|
+
计算点到三角形的距离和相关信息
|
|
7
|
+
|
|
8
|
+
参数:
|
|
9
|
+
P: 待测点 [x, y, z]
|
|
10
|
+
A, B, C: 三角形三个顶点 [x, y, z]
|
|
11
|
+
|
|
12
|
+
返回:
|
|
13
|
+
distance: 点到三角形的最小距离
|
|
14
|
+
projection: 垂足坐标
|
|
15
|
+
is_inside: 垂足是否在三角形内部
|
|
16
|
+
barycentric: 重心坐标 [u, v, w]
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# 转换为numpy数组
|
|
20
|
+
P = np.array(P)
|
|
21
|
+
A = np.array(A)
|
|
22
|
+
B = np.array(B)
|
|
23
|
+
C = np.array(C)
|
|
24
|
+
|
|
25
|
+
# 计算平面法向量
|
|
26
|
+
AB = B - A
|
|
27
|
+
AC = C - A
|
|
28
|
+
normal = np.cross(AB, AC)
|
|
29
|
+
|
|
30
|
+
# 处理退化三角形的情况
|
|
31
|
+
if np.linalg.norm(normal) < 1e-10:
|
|
32
|
+
raise ValueError("三角形退化或面积为零")
|
|
33
|
+
|
|
34
|
+
# 计算点到平面的距离
|
|
35
|
+
AP = P - A
|
|
36
|
+
distance_to_plane = abs(np.dot(AP, normal)) / np.linalg.norm(normal)
|
|
37
|
+
|
|
38
|
+
# 计算垂足坐标
|
|
39
|
+
t = np.dot(AP, normal) / np.dot(normal, normal)
|
|
40
|
+
projection = P - t * normal
|
|
41
|
+
|
|
42
|
+
# 计算重心坐标
|
|
43
|
+
v0 = C - A
|
|
44
|
+
v1 = B - A
|
|
45
|
+
v2 = projection - A
|
|
46
|
+
|
|
47
|
+
d00 = np.dot(v0, v0)
|
|
48
|
+
d01 = np.dot(v0, v1)
|
|
49
|
+
d11 = np.dot(v1, v1)
|
|
50
|
+
d20 = np.dot(v2, v0)
|
|
51
|
+
d21 = np.dot(v2, v1)
|
|
52
|
+
|
|
53
|
+
denom = d00 * d11 - d01 * d01
|
|
54
|
+
|
|
55
|
+
# 处理数值精度问题
|
|
56
|
+
if abs(denom) < 1e-10:
|
|
57
|
+
v = w = 0
|
|
58
|
+
u = 1
|
|
59
|
+
else:
|
|
60
|
+
v = (d11 * d20 - d01 * d21) / denom
|
|
61
|
+
w = (d00 * d21 - d01 * d20) / denom
|
|
62
|
+
u = 1.0 - v - w
|
|
63
|
+
|
|
64
|
+
# 判断垂足是否在三角形内部
|
|
65
|
+
is_inside = (u >= -1e-10) and (v >= -1e-10) and (w >= -1e-10)
|
|
66
|
+
|
|
67
|
+
if is_inside:
|
|
68
|
+
# 垂足在三角形内,最小距离就是到平面的距离
|
|
69
|
+
min_distance = distance_to_plane
|
|
70
|
+
else:
|
|
71
|
+
# 垂足在三角形外,需要计算到三条边的最短距离
|
|
72
|
+
dist_AB = point_to_segment_distance(P, A, B)
|
|
73
|
+
dist_BC = point_to_segment_distance(P, B, C)
|
|
74
|
+
dist_CA = point_to_segment_distance(P, C, A)
|
|
75
|
+
min_distance = min(dist_AB, dist_BC, dist_CA)
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
"distance": min_distance,
|
|
79
|
+
"projection": projection.tolist(),
|
|
80
|
+
"is_inside": is_inside,
|
|
81
|
+
"barycentric": [u, v, w],
|
|
82
|
+
"distance_to_plane": distance_to_plane,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def point_to_segment_distance(P, A, B):
|
|
87
|
+
"""计算点到线段的最短距离"""
|
|
88
|
+
P, A, B = np.array(P), np.array(A), np.array(B)
|
|
89
|
+
|
|
90
|
+
AB = B - A
|
|
91
|
+
AP = P - A
|
|
92
|
+
|
|
93
|
+
# 计算投影参数t
|
|
94
|
+
t = np.dot(AP, AB) / np.dot(AB, AB)
|
|
95
|
+
|
|
96
|
+
# 限制t在[0,1]范围内
|
|
97
|
+
t = max(0, min(1, t))
|
|
98
|
+
|
|
99
|
+
# 计算最近点
|
|
100
|
+
nearest_point = A + t * AB
|
|
101
|
+
|
|
102
|
+
# 返回距离
|
|
103
|
+
return np.linalg.norm(P - nearest_point)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def is_point_in_triangle(P, A, B, C):
|
|
107
|
+
"""判断点是否在三角形内部(使用重心坐标法)"""
|
|
108
|
+
A, B, C, P = np.array(A), np.array(B), np.array(C), np.array(P)
|
|
109
|
+
|
|
110
|
+
# 计算重心坐标
|
|
111
|
+
v0 = C - A
|
|
112
|
+
v1 = B - A
|
|
113
|
+
v2 = P - A
|
|
114
|
+
|
|
115
|
+
d00 = np.dot(v0, v0)
|
|
116
|
+
d01 = np.dot(v0, v1)
|
|
117
|
+
d11 = np.dot(v1, v1)
|
|
118
|
+
d20 = np.dot(v2, v0)
|
|
119
|
+
d21 = np.dot(v2, v1)
|
|
120
|
+
|
|
121
|
+
denom = d00 * d11 - d01 * d01
|
|
122
|
+
|
|
123
|
+
if abs(denom) < 1e-10:
|
|
124
|
+
return False
|
|
125
|
+
|
|
126
|
+
v = (d11 * d20 - d01 * d21) / denom
|
|
127
|
+
w = (d00 * d21 - d01 * d20) / denom
|
|
128
|
+
u = 1.0 - v - w
|
|
129
|
+
|
|
130
|
+
return (u >= -1e-10) and (v >= -1e-10) and (w >= -1e-10)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def is_point_in_triangles(P, tins, range):
|
|
134
|
+
"""判断点是否在多个三角形内部"""
|
|
135
|
+
for idx, tin in enumerate(tins):
|
|
136
|
+
result = is_point_in_triangle(P, tin[0], tin[1], tin[2])
|
|
137
|
+
if result["is_inside"] and result["distance"] <= range[idx]:
|
|
138
|
+
return 1, idx
|
|
139
|
+
return 0, -1
|
flkit/alg/index.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
预测工具。这是一个接口用于定义预测器的基本功能。
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import pickle
|
|
6
|
+
from bson import ObjectId
|
|
7
|
+
from abc import abstractmethod
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Predictor:
|
|
11
|
+
def __init__(self):
|
|
12
|
+
self.uid = ObjectId()
|
|
13
|
+
self.model = None
|
|
14
|
+
self.params = None
|
|
15
|
+
|
|
16
|
+
def save(self, file_path):
|
|
17
|
+
"""
|
|
18
|
+
保存模型到文件
|
|
19
|
+
:param file_path: 文件路径
|
|
20
|
+
:return: None
|
|
21
|
+
"""
|
|
22
|
+
with open(file_path, "wb") as file:
|
|
23
|
+
pickle.dump(self.model, file)
|
|
24
|
+
|
|
25
|
+
def load(self, file_path):
|
|
26
|
+
"""
|
|
27
|
+
从文件加载模型
|
|
28
|
+
:param file_path: 文件路径
|
|
29
|
+
:return: None
|
|
30
|
+
"""
|
|
31
|
+
with open(file_path, "rb") as file:
|
|
32
|
+
return pickle.load(file)
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def predict(self, point):
|
|
36
|
+
"""
|
|
37
|
+
预测目标点的属性值
|
|
38
|
+
:param point: 目标点坐标
|
|
39
|
+
:return: 预测值
|
|
40
|
+
"""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def loss(self, point):
|
|
45
|
+
"""
|
|
46
|
+
计算预测值与实际值的损失
|
|
47
|
+
:param point: 目标点坐标
|
|
48
|
+
:return: 损失值
|
|
49
|
+
"""
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
def add_params(self, params):
|
|
53
|
+
"""
|
|
54
|
+
添加预测器参数
|
|
55
|
+
:param params: 参数字典
|
|
56
|
+
:return: None
|
|
57
|
+
"""
|
|
58
|
+
if params is None:
|
|
59
|
+
return
|
|
60
|
+
self.params = params
|
|
61
|
+
|
|
62
|
+
def reset(self):
|
|
63
|
+
"""
|
|
64
|
+
重置预测器参数
|
|
65
|
+
:return: None
|
|
66
|
+
"""
|
|
67
|
+
if self.params is None:
|
|
68
|
+
return
|
|
69
|
+
self.params = None
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from pykrige.ok import OrdinaryKriging
|
|
3
|
+
from pykrige.uk3d import UniversalKriging3D
|
|
4
|
+
from pykrige.ok3d import OrdinaryKriging3D
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Kriging2D:
|
|
8
|
+
"""二维普通克里金插值"""
|
|
9
|
+
|
|
10
|
+
def __init__(self, variogram_model="spherical", nlags=20):
|
|
11
|
+
self.variogram_model = variogram_model
|
|
12
|
+
self.nlags = nlags
|
|
13
|
+
self.ok = None
|
|
14
|
+
|
|
15
|
+
def fit(self, xyzv: np.ndarray):
|
|
16
|
+
"""
|
|
17
|
+
训练Kriging2D模型
|
|
18
|
+
|
|
19
|
+
Parameters:
|
|
20
|
+
-----------
|
|
21
|
+
xyzv : np.ndarray, shape (N, 3)
|
|
22
|
+
已知点数据,每行为 [x, y, z],其中z为插值目标值
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
--------
|
|
26
|
+
self : Kriging2D
|
|
27
|
+
返回自身以支持链式调用
|
|
28
|
+
"""
|
|
29
|
+
xyzv = np.atleast_2d(xyzv)
|
|
30
|
+
if xyzv.shape[1] != 3:
|
|
31
|
+
raise ValueError("输入数据必须是3列:[x, y, z]")
|
|
32
|
+
|
|
33
|
+
self.ok = OrdinaryKriging(
|
|
34
|
+
xyzv[:, 0],
|
|
35
|
+
xyzv[:, 1],
|
|
36
|
+
xyzv[:, 2],
|
|
37
|
+
variogram_model=self.variogram_model,
|
|
38
|
+
nlags=self.nlags,
|
|
39
|
+
enable_plotting=False,
|
|
40
|
+
)
|
|
41
|
+
return self
|
|
42
|
+
|
|
43
|
+
def predict(self, xy: np.ndarray):
|
|
44
|
+
"""
|
|
45
|
+
在指定位置进行预测
|
|
46
|
+
|
|
47
|
+
Parameters:
|
|
48
|
+
-----------
|
|
49
|
+
xy : np.ndarray, shape (M, 2) or (2,)
|
|
50
|
+
待插值点的坐标 [x, y]
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
--------
|
|
54
|
+
float or np.ndarray
|
|
55
|
+
- 单点输入 (2,): 返回标量值
|
|
56
|
+
- 多点输入 (M, 2): 返回数组 shape (M,)
|
|
57
|
+
"""
|
|
58
|
+
# 检查输入是单点还是多点
|
|
59
|
+
is_single_point = xy.ndim == 1 or (xy.ndim == 2 and xy.shape[0] == 1)
|
|
60
|
+
|
|
61
|
+
xy = np.atleast_2d(xy)
|
|
62
|
+
z, _ = self.ok.execute("points", xy[:, 0], xy[:, 1])
|
|
63
|
+
|
|
64
|
+
# 根据输入类型返回相应格式
|
|
65
|
+
if is_single_point:
|
|
66
|
+
return float(z[0]) # 单点返回标量
|
|
67
|
+
else:
|
|
68
|
+
return z # 多点返回数组
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class Kriging3DUn:
|
|
72
|
+
"""三维泛克里金插值"""
|
|
73
|
+
|
|
74
|
+
def __init__(self, variogram_model="spherical", nlags=20):
|
|
75
|
+
self.variogram_model = variogram_model
|
|
76
|
+
self.nlags = nlags
|
|
77
|
+
self.uk3d = None
|
|
78
|
+
|
|
79
|
+
def fit(self, xyzv: np.ndarray):
|
|
80
|
+
"""
|
|
81
|
+
xyzv: (N,4) 每行 [x,y,z,value]
|
|
82
|
+
"""
|
|
83
|
+
self.uk3d = UniversalKriging3D(
|
|
84
|
+
xyzv[:, 0],
|
|
85
|
+
xyzv[:, 1],
|
|
86
|
+
xyzv[:, 2],
|
|
87
|
+
xyzv[:, 3],
|
|
88
|
+
variogram_model=self.variogram_model,
|
|
89
|
+
nlags=self.nlags,
|
|
90
|
+
enable_plotting=False,
|
|
91
|
+
)
|
|
92
|
+
return self
|
|
93
|
+
|
|
94
|
+
def predict(self, xyz: np.ndarray):
|
|
95
|
+
"""
|
|
96
|
+
在指定位置进行预测
|
|
97
|
+
|
|
98
|
+
Parameters:
|
|
99
|
+
-----------
|
|
100
|
+
xyz : np.ndarray, shape (M, 3) or (3,)
|
|
101
|
+
待插值点的坐标 [x, y, z]
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
--------
|
|
105
|
+
float or np.ndarray
|
|
106
|
+
- 单点输入 (3,): 返回标量值
|
|
107
|
+
- 多点输入 (M, 3): 返回数组 shape (M,)
|
|
108
|
+
"""
|
|
109
|
+
# 检查输入是单点还是多点
|
|
110
|
+
is_single_point = xyz.ndim == 1 or (xyz.ndim == 2 and xyz.shape[0] == 1)
|
|
111
|
+
|
|
112
|
+
xyz = np.atleast_2d(xyz)
|
|
113
|
+
v, _ = self.uk3d.execute("points", xyz[:, 0], xyz[:, 1], xyz[:, 2])
|
|
114
|
+
|
|
115
|
+
# 根据输入类型返回相应格式
|
|
116
|
+
if is_single_point:
|
|
117
|
+
return float(v[0]) # 单点返回标量
|
|
118
|
+
else:
|
|
119
|
+
return v # 多点返回数组
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class Kriging3D:
|
|
123
|
+
"""三维普通克里金插值"""
|
|
124
|
+
|
|
125
|
+
def __init__(self, variogram_model="spherical", nlags=20):
|
|
126
|
+
self.variogram_model = variogram_model
|
|
127
|
+
self.nlags = nlags
|
|
128
|
+
self.ok3d = None
|
|
129
|
+
|
|
130
|
+
def fit(self, xyzv: np.ndarray):
|
|
131
|
+
"""
|
|
132
|
+
拟合3D普通克里金模型
|
|
133
|
+
|
|
134
|
+
Parameters:
|
|
135
|
+
-----------
|
|
136
|
+
xyzv: np.ndarray, shape (N, 4)
|
|
137
|
+
每行为 [x, y, z, value],其中:
|
|
138
|
+
- x, y, z: 空间坐标
|
|
139
|
+
- value: 在该位置的观测值
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
--------
|
|
143
|
+
self: Kriging3DUn
|
|
144
|
+
返回自身以支持链式调用
|
|
145
|
+
"""
|
|
146
|
+
self.ok3d = OrdinaryKriging3D(
|
|
147
|
+
xyzv[:, 0], # x坐标
|
|
148
|
+
xyzv[:, 1], # y坐标
|
|
149
|
+
xyzv[:, 2], # z坐标
|
|
150
|
+
xyzv[:, 3], # 观测值
|
|
151
|
+
variogram_model=self.variogram_model,
|
|
152
|
+
nlags=self.nlags,
|
|
153
|
+
enable_plotting=False,
|
|
154
|
+
)
|
|
155
|
+
return self
|
|
156
|
+
|
|
157
|
+
def predict(self, xyz: np.ndarray):
|
|
158
|
+
"""
|
|
159
|
+
在指定位置进行预测
|
|
160
|
+
|
|
161
|
+
Parameters:
|
|
162
|
+
-----------
|
|
163
|
+
xyz: np.ndarray, shape (N, 3) or (3,)
|
|
164
|
+
预测位置的坐标 [x, y, z]
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
--------
|
|
168
|
+
float or np.ndarray
|
|
169
|
+
- 单点输入 (3,): 返回标量值
|
|
170
|
+
- 多点输入 (M, 3): 返回数组 shape (M,)
|
|
171
|
+
"""
|
|
172
|
+
if self.ok3d is None:
|
|
173
|
+
raise ValueError("模型尚未拟合,请先调用 fit() 方法")
|
|
174
|
+
|
|
175
|
+
# 检查输入是单点还是多点
|
|
176
|
+
is_single_point = xyz.ndim == 1 or (xyz.ndim == 2 and xyz.shape[0] == 1)
|
|
177
|
+
|
|
178
|
+
xyz = np.atleast_2d(xyz)
|
|
179
|
+
v, _ = self.ok3d.execute("points", xyz[:, 0], xyz[:, 1], xyz[:, 2])
|
|
180
|
+
|
|
181
|
+
# 根据输入类型返回相应格式
|
|
182
|
+
if is_single_point:
|
|
183
|
+
return float(v[0]) # 单点返回标量
|
|
184
|
+
else:
|
|
185
|
+
return v # 多点返回数组
|
|
186
|
+
|
|
187
|
+
def predict_grid(self, x_range, y_range, z_range, resolution=None):
|
|
188
|
+
"""
|
|
189
|
+
在规则网格上进行预测
|
|
190
|
+
|
|
191
|
+
Parameters:
|
|
192
|
+
-----------
|
|
193
|
+
x_range: tuple
|
|
194
|
+
x方向的范围 (x_min, x_max)
|
|
195
|
+
y_range: tuple
|
|
196
|
+
y方向的范围 (y_min, y_max)
|
|
197
|
+
z_range: tuple
|
|
198
|
+
z方向的范围 (z_min, z_max)
|
|
199
|
+
resolution: tuple, optional
|
|
200
|
+
网格分辨率 (nx, ny, nz),默认为 (50, 50, 50)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
--------
|
|
204
|
+
tuple
|
|
205
|
+
(grid_x, grid_y, grid_z, predictions)
|
|
206
|
+
- grid_x, grid_y, grid_z: 网格坐标
|
|
207
|
+
- predictions: 预测值网格
|
|
208
|
+
"""
|
|
209
|
+
if self.ok3d is None:
|
|
210
|
+
raise ValueError("模型尚未拟合,请先调用 fit() 方法")
|
|
211
|
+
|
|
212
|
+
if resolution is None:
|
|
213
|
+
resolution = (50, 50, 50)
|
|
214
|
+
|
|
215
|
+
# 创建网格
|
|
216
|
+
x = np.linspace(x_range[0], x_range[1], resolution[0])
|
|
217
|
+
y = np.linspace(y_range[0], y_range[1], resolution[1])
|
|
218
|
+
z = np.linspace(z_range[0], z_range[1], resolution[2])
|
|
219
|
+
|
|
220
|
+
# 执行网格预测
|
|
221
|
+
predictions, _ = self.ok3d.execute("grid", x, y, z)
|
|
222
|
+
|
|
223
|
+
# 创建网格坐标
|
|
224
|
+
grid_x, grid_y, grid_z = np.meshgrid(x, y, z, indexing="ij")
|
|
225
|
+
|
|
226
|
+
return grid_x, grid_y, grid_z, predictions
|