径向网格构建

代码逻辑

  1. 输入:re平衡距离,rmin_obs,rmax_obs(转折点数据),r_ab(数据点)
  2. 收集所有的侯选位置
  3. 计算观察到的最小和最大距离
  4. 计算边界(带padding)
  5. 如果观察数据不足,使用保守地默认边界
  6. 使用np.linspace创建均匀的网格
  7. 计算网格距离dr
  8. 返回:RadialGrid(r_grid,dr,r_lo,r_hi)

定义数据类RadialGrid

python 复制代码
@dataclass(frozen=True)
class RadialGrid:
    """Container for a uniformly spaced radial grid."""

    r_grid: np.ndarray
    dr: float # 网格间距
    r_lo: float # 网格最小值
    r_hi: float # 网格最大值
  • @dataclass :装饰器,自动生成__init__, __repr__, __eq__等方法。 frozen=True : 使数据类不可变(创建后不能修改属性)

*装饰器详解

装饰器是Python中的一种设计模式,用于在不修改函数/类原始代码的情况下,为其添加额外功能。

@dataclass 是python3.7引入的标准库装饰器,用于自动为类生成常用方法

python 复制代码
from dataclasses import dataclass
@dataclass
class Person:
	name: str
	age: int
	city: str
#使用
p1 = Person("Zhang",23,"Beijing")
print(p1.name)
print(p1)

"""
如果不用装饰器的等价写法
"""
class Person: 
	# 1. 初始化方法,创建对象时自动调用
	def __init__(self, name:str,age:int,city:str):
		self.name = name
		self.age = age
		self.city = city
	
	# 2. 返回对象的字符串表示(用于调试)
	def __repr__(self):
		return f"Person(name = {self.name!r},age={self.age~r},city={self.city!r})"
	
	#3. 定义相等性比较(==运算符)
	def __eq__(self,other):
		#检车other是否是Pserson类型
		if not isinstance(other,Person):
		return NotImplemented # 返回NotImplemented 让Python 尝试 other.__eq__(self)
		
		#比较所有属性是否相等
		return(self.name==other.name and self.age == other.age and self.city == other.city)


# 使用方式完全相同
p1 = Person("张三", 25, "北京")
print(p1.name)  # 张三
print(p1)       # Person(name='张三', age=25, city='北京')

# 测试相等性比较
p2 = Person("张三", 25, "北京")
p3 = Person("李四", 30, "上海")
print(p1 == p2)  # True
print(p1 == p3)  # False

构建径向网格的方法

python 复制代码
def build_radial_grid(
    re: float,
    rmin_obs: Iterable[float] | None = None, # - Iterable[float] : 可迭代的浮点数序列(列表、数组等)
																				 #- | None : 可以是 None
																				 #- = None : 默认值为 None
    rmax_obs: Iterable[float] | None = None,
    r_ab: Iterable[float] | None = None,
    nr: int = 512,												 # 默认网格数 512
    padding_fraction: float = 0.08,				 # 在观测数据范围外添加额外空间
    min_left_fraction: float = 0.45,				 # 左边界的保守下限(平衡距离的35%)
    max_right_factor: float = 3.5,					 # 右边界的保守上限(平衡距离的4倍)
) -> RadialGrid:
    
    if nr < 2:
        raise ValueError("nr must be at least 2.")
    if not np.isfinite(re) or re <= 0.0:
        raise ValueError(f"re must be a positive finite value, got {re!r}.")
    if padding_fraction < 0.0:
        raise ValueError("padding_fraction must be non-negative.")

    candidates = [float(re)]														#创建列表,目前只有一个元素是平衡位置
    candidates.extend(_finite_positive_values(rmin_obs))		#将可迭代对象的元素添加到列表末尾
    candidates.extend(_finite_positive_values(rmax_obs))
    candidates.extend(_finite_positive_values(r_ab))

    observed_min = min(candidates)
    observed_max = max(candidates)
    span = max(observed_max - observed_min, re)
    pad = padding_fraction * span

    fallback_lo = min_left_fraction * re
    fallback_hi = max_right_factor * re
    r_lo = min(observed_min - pad, fallback_lo)
    r_hi = max(observed_max + pad, fallback_hi)

    r_lo = max(r_lo, 1.0e-6)
    if r_hi <= r_lo:
        raise ValueError(f"Invalid radial grid bounds: r_lo={r_lo}, r_hi={r_hi}.")

    r_grid = np.linspace(r_lo, r_hi, nr, dtype=np.float64)
    dr = float(r_grid[1] - r_grid[0])
    return RadialGrid(r_grid=r_grid, dr=dr, r_lo=float(r_lo), r_hi=float(r_hi))
相关推荐
爱跑步的程序员~1 小时前
RAG 技术全面解析:从原理到实践
python·ai·langchain·rag
gf13211111 小时前
飞书长连接_事件订阅(接收消息,审批任务状态变更)
开发语言·python·飞书
vx_biyesheji00041 小时前
计算机毕业设计:Python医疗数据分析平台 Flask框架 数据分析 可视化 医疗大数据 用户画像(建议收藏)✅
大数据·python·深度学习·数据分析·django·flask·课程设计
m0_702036531 小时前
CSS如何兼容新旧方案结合响应式容器查询
jvm·数据库·python
ZHW_AI课题组2 小时前
基于ElasticNet网格搜索的汽车燃油效率预测
python·机器学习·回归算法
在坚持一下我可没意见2 小时前
Python 修仙修炼录 05:循环神通,省去无用苦修
开发语言·python·面试·入门·循环·复习
大飞记Python2 小时前
从“驱动地狱”到一行代码:WebDriverManager使用手记(附模板)
python·测试
Cloud_Shy6182 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第九章 Excel 自动化 上篇)
python·数据分析·excel·numpy·pandas
子午2 小时前
基于YOLO的玫瑰叶片检测系统~Python+深度学习+人工智能+目标检测+YOLOV8算法
人工智能·python·yolo