Python中实现支持多维查找的自定义数据结构需求咨询
Python自定义N维数学对象数据结构实现方案
核心设计思路
针对你的需求,推荐采用元组键字典+维度元数据管理的组合方案,既避免多维网格的稀疏数据问题,又通过分层查询逻辑简化部分维度的检索操作:
- 用元组(按维度顺序排列的基变量值)作为字典主键,存储唯一对应的目标值,天然适配非规整的基变量组合
- 单独维护维度元数据(名称、单位、转换规则),实现单位动态切换
- 实现分层查询逻辑,对部分维度查询时,自动筛选匹配的键并生成低维结构实例
具体实现代码
from typing import Dict, List, Tuple, Any, Callable, Optional class NDSurface: def __init__(self, dimensions: List[Dict[str, Any]]): """ 初始化N维曲面对象 :param dimensions: 维度配置列表,每个维度包含: - name: 维度名称(str) - unit: 当前单位(str) - converter: 单位转换函数,接收旧值返回新值(Callable[[float], float]) """ self.dimensions = dimensions self.data: Dict[Tuple[Any, ...], Any] = {} def add_point(self, basis_values: Tuple[Any, ...], value: Any): """添加一个基变量组合对应的值""" if len(basis_values) != len(self.dimensions): raise ValueError(f"基变量数量需与维度数量匹配:{len(self.dimensions)}") self.data[basis_values] = value def get(self, basis_values: Tuple[Any, ...]) -> Any: """按完整维度组合查询对应值""" return self.data.get(basis_values) def slice(self, partial_basis: Dict[int, Any]) -> 'NDSurface': """ 按部分维度查询,返回低维结构 :param partial_basis: 键为维度索引,值为对应基变量值的字典 """ # 确定剩余维度 remaining_dims = [dim for idx, dim in enumerate(self.dimensions) if idx not in partial_basis] if not remaining_dims: raise ValueError("至少保留一个维度") # 创建低维对象 low_dim_surface = NDSurface(remaining_dims) # 筛选匹配的点并添加到低维对象 for basis, value in self.data.items(): match = True for idx, val in partial_basis.items(): if basis[idx] != val: match = False break if match: # 生成低维基变量元组 low_basis = tuple(basis[i] for i in range(len(basis)) if i not in partial_basis) low_dim_surface.add_point(low_basis, value) return low_dim_surface def convert_unit(self, dim_index: int, new_unit: str, converter: Callable[[float], float]): """切换指定维度的单位""" # 更新维度元数据 self.dimensions[dim_index]['unit'] = new_unit self.dimensions[dim_index]['converter'] = converter # 转换所有基变量中对应维度的值 new_data = {} for basis, value in self.data.items(): converted_basis = list(basis) converted_basis[dim_index] = converter(converted_basis[dim_index]) new_data[tuple(converted_basis)] = value self.data = new_data
关键功能适配说明
- 1至N维支持:通过
dimensions参数动态定义维度数量,基变量元组长度与维度数量绑定,确保每个组合唯一对应值 - 灵活查询:
- 完整维度查询直接调用
get方法,通过元组键快速检索 - 部分维度查询调用
slice方法,传入维度索引和对应值,自动生成低维NDSurface实例(如从3维曲面切片得到2维曲面或1维曲线)
- 完整维度查询直接调用
- 单位自定义与切换:初始化时指定每个维度的单位和转换函数,调用
convert_unit可动态切换单位,同时自动转换所有基变量的对应值 - 非规整基变量组合:采用字典存储,仅保存实际存在的基变量组合,完全避免稀疏数据问题
使用示例
# 初始化2维曲面(温度、压力 -> 密度) dimensions = [ {"name": "temperature", "unit": "°C", "converter": lambda x: x + 273.15}, {"name": "pressure", "unit": "kPa", "converter": lambda x: x * 1000} ] surface = NDSurface(dimensions) # 添加数据点 surface.add_point((25, 101.3), 1.225) surface.add_point((0, 101.3), 1.293) surface.add_point((25, 50), 0.607) # 完整维度查询 print(surface.get((25, 101.3))) # 输出1.225 # 切片查询(固定温度25°C,得到压力-密度曲线) pressure_curve = surface.slice({0: 25}) print(pressure_curve.data) # 输出{(101.3,): 1.225, (50,): 0.607} # 切换温度单位为开尔文 surface.convert_unit(0, "K", lambda x: x + 273.15) print(surface.get((298.15, 101.3))) # 输出1.225
内容的提问来源于stack exchange,提问作者tristanvandevelde
相关产品推荐
相关产品推荐

