You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 1至N维支持:通过dimensions参数动态定义维度数量,基变量元组长度与维度数量绑定,确保每个组合唯一对应值
  2. 灵活查询:
    • 完整维度查询直接调用get方法,通过元组键快速检索
    • 部分维度查询调用slice方法,传入维度索引和对应值,自动生成低维NDSurface实例(如从3维曲面切片得到2维曲面或1维曲线)
  3. 单位自定义与切换:初始化时指定每个维度的单位和转换函数,调用convert_unit可动态切换单位,同时自动转换所有基变量的对应值
  4. 非规整基变量组合:采用字典存储,仅保存实际存在的基变量组合,完全避免稀疏数据问题

使用示例

# 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:13:18