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

宇宙学模拟中网格点到Mpc/h单位的映射方法求助

网格点到物理单位(Mpc/h)的映射方案

核心转换逻辑

你的需求是把0-128的网格坐标线性映射到0-100 Mpc/h,这是一个简单的线性缩放问题,公式非常直接:
物理坐标 = (网格坐标 / 总网格数) * 模拟盒大小
代入你的参数(总网格数128,模拟盒大小100 Mpc/h),具体公式为:
mpc_h = (grid_pos / 128) * 100

Python实现与应用方法

1. 定义通用转换函数

可以写一个轻量函数处理单个值或批量数组:

def grid_to_mpch(grid_pos, box_size=100, grid_size=128):
    return (grid_pos / grid_size) * box_size

该函数支持单个数值、NumPy数组、Pandas序列等多种输入类型的批量转换。

2. 直接应用到Matplotlib等高线图

如果是从头绘制图表,直接用转换后的物理坐标生成图像:

import matplotlib.pyplot as plt
import numpy as np

# 示例:假设你的密度场数据是128x128的数组
density_field = np.random.rand(128, 128)

# 生成原始网格坐标
x_grid = np.arange(128)
y_grid = np.arange(128)

# 转换为Mpc/h单位的物理坐标
x_mpch = grid_to_mpch(x_grid)
y_mpch = grid_to_mpch(y_grid)

# 绘制等高线图
plt.contourf(x_mpch, y_mpch, density_field)

# 设置坐标轴属性
plt.xlabel('X (Mpc/h)')
plt.ylabel('Y (Mpc/h)')
plt.xlim(0, 100)
plt.ylim(0, 100)

plt.colorbar(label='Density')
plt.show()

3. 修改已绘制图表的刻度

如果已经生成了以网格点为轴的图表,可直接替换刻度标签:

# 获取当前坐标轴对象
ax = plt.gca()

# 处理X轴
original_x_ticks = ax.get_xticks()
new_x_ticks = grid_to_mpch(original_x_ticks)
ax.set_xticks(original_x_ticks)
ax.set_xticklabels([f'{tick:.1f}' for tick in new_x_ticks])
ax.set_xlabel('X (Mpc/h)')

# 处理Y轴
original_y_ticks = ax.get_yticks()
new_y_ticks = grid_to_mpch(original_y_ticks)
ax.set_yticks(original_y_ticks)
ax.set_yticklabels([f'{tick:.1f}' for tick in new_y_ticks])
ax.set_ylabel('Y (Mpc/h)')

plt.draw()

注意事项

  • 如果你的网格索引从1开始(而非0),需先将网格坐标减1再代入公式:mpc_h = ((grid_pos - 1)/128)*100
  • 线性映射仅适用于均匀网格,这也是宇宙学模拟中最常见的网格设置

内容的提问来源于stack exchange,提问作者Manos Bougioukoglou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:41:41