【程序分享】三维到一维速度模型转换程序
itomcoil 2025-08-30 23:53 5 浏览
1. 简介
1.1 概述
三维到一维速度模型转换程序是一个专门为地震学家和地球物理学家设计的Python工具,用于将三维速度模型转换为一维速度剖面。 这种转换对于地震定位和震源机制反演研究至关重要 。
2. 安装说明
2.1 系统要求
Python >= 3.7
numpy >= 1.19.0
pandas >= 1.2.0
scipy >= 1.6.0
matplotlib >= 3.3.0
# 下载程序文件
wget https://github.com/zhangsuxiang/3D-to-1D-Velocity-Model-Converter
# 安装依赖包
pip install numpy pandas scipy matplotlib
# 可选:在虚拟环境中安装
python -m venv velo_env
source velo_env/bin/activate # Windows系统: velo_env\Scripts\activate
pip install numpy pandas scipy matplotlib
# 测试导入
python -c "from velocity_3d_to_1d import Velocity3Dto1D; print('安装成功!')"
3. 快速入门
3.1 基本使用流程
from velocity_3d_to_1d import Velocity3Dto1D
# 加载三维速度模型
converter = Velocity3Dto1D('velocity_3d.txt', velocity_type='Vp')
# 提取一维模型
depths, velocities = converter.extract_1d_velocity(method='weighted_mean')
# 插值到1km间隔
depths_new, vel_new = converter.interpolate_1d_model(depth_interval=1.0)
# 保存结果
converter.save_1d_model('velocity_1d.dat', depths_new, vel_new, format='hypo71')
3.2 输入文件格式
输入文件应包含4列数据:
经度 纬度 深度(km) 速度(km/s或比值)
102.5 25.3 0.0 5.80
102.5 25.3 5.0 6.10
102.5 25.3 10.0 6.35
...
4. 详细使用说明
4.1 数据加载
从文件加载
# 自动检测分隔符
converter = Velocity3Dto1D('data.txt', velocity_type='Vp')
# 指定速度类型
converter = Velocity3Dto1D('data.csv', velocity_type='Vs')
import numpy as np
# 创建或加载形状为(n, 4)的数组
data_array = np.loadtxt('data.txt')
converter = Velocity3Dto1D(data_array=data_array, velocity_type='VpVs')
4.2 提取方法详解
平均值法(默认)
depths, velocities = converter.extract_1d_velocity(method='mean')
# 按纬度加权,考虑地球球面效应
depths, velocities = converter.extract_1d_velocity(
method='weighted_mean',
weight_by_area=True
)
# 从特定区域提取
depths, velocities = converter.extract_1d_velocity(
method='weighted_mean',
region=(经度最小值, 经度最大值, 纬度最小值, 纬度最大值)
)
# 线性插值(适用于有明显界面的模型)
depths_linear, vel_linear = converter.interpolate_1d_model(
depth_interval=0.5,
kind='linear'
)
# 三次样条插值(适用于平滑模型)
depths_cubic, vel_cubic = converter.interpolate_1d_model(
depth_interval=1.0,
kind='cubic'
)
# Akima插值(保形插值,防止过冲)
depths_akima, vel_akima = converter.interpolate_1d_model(
depth_interval=2.0,
kind='akima'
)
# 执行质量检查
qc_report = converter.quality_check(depths, velocities)
# 查看报告详情
print(f"状态: {qc_report['status']}")
print(f"警告: {qc_report['warnings']}")
print(f"信息: {qc_report['info']}")
5. 输出格式说明
5.1 HYPO71格式
# HYPO71 velocity model - Vp
# Depth(km) Vp(km/s)
0.00 5.800
1.00 5.850
2.00 5.900
5.2 HypoInverse格式
* HYPOINVERSE VELOCITY MODEL - Vp
5.80 0.00
5.85 1.00
5.90 2.00
5.3 VELEST格式
VELEST velocity model - Vp
3
5.800 5.850 5.900
0.00 1.00 2.00
# 1D Velocity Model - Vp
# Depth(km) Vp(km/s)
0.0005.800
1.0005.850
2.0005.900
6. 最佳实践
6.1 数据准备
- 数据清理
- 坐标系统
6.2 方法选择建议
7. 使用示例
7.1 完整工作流程示例
import numpy as np
import matplotlib.pyplot as plt
from velocity_3d_to_1d import Velocity3Dto1D
# 步骤1:加载P波速度模型
print("加载三维P波速度模型...")
converter_vp = Velocity3Dto1D('vp_model_3d.txt', velocity_type='Vp')
# 步骤2:定义感兴趣区域
region = (100.0, 105.0, 20.0, 25.0) # 经度最小, 经度最大, 纬度最小, 纬度最大
# 步骤3:提取一维模型
print("提取一维模型...")
depths_vp, velocities_vp = converter_vp.extract_1d_velocity(
method='weighted_mean',
region=region,
weight_by_area=True
)
# 步骤4:插值到所需分辨率
print("插值模型...")
depths_interp, vel_interp = converter_vp.interpolate_1d_model(
depth_interval=0.5, # 500m间隔
depth_max=100.0, # 最大深度100km
kind='cubic'
)
# 步骤5:质量检查
print("执行质量检查...")
qc_report = converter_vp.quality_check(depths_interp, vel_interp)
if qc_report['status'] == 'PASS':
print(" 模型通过所有质量检查")
else:
print(" 模型存在警告:")
for warning in qc_report['warnings']:
print(f" - {warning}")
# 步骤6:保存多种格式
print("保存模型...")
converter_vp.save_1d_model('vp_hypo71.dat', depths_interp, vel_interp, format='hypo71')
converter_vp.save_1d_model('vp_velest.dat', depths_interp, vel_interp, format='velest')
# 步骤7:可视化结果
print("创建可视化图表...")
fig = converter_vp.plot_comparison(
(depths_vp, velocities_vp),
(depths_interp, vel_interp),
save_figure='vp_model_comparison.png'
)
plt.show()
# 步骤8:生成统计报告
converter_vp.plot_statistics(save_figure='vp_statistics.png')
9.2 联合Vp-Vs分析
# 加载Vp和Vs模型
converter_vp = Velocity3Dto1D('vp_3d.txt', velocity_type='Vp')
converter_vs = Velocity3Dto1D('vs_3d.txt', velocity_type='Vs')
# 使用相同参数提取一维模型
depths_vp, vel_vp = converter_vp.extract_1d_velocity(method='weighted_mean')
depths_vs, vel_vs = converter_vs.extract_1d_velocity(method='weighted_mean')
# 计算Vp/Vs比值
vpvs_ratio = vel_vp / vel_vs
# 创建Vp/Vs模型
vpvs_data = np.column_stack([
np.full(len(depths_vp), 105.0), # 虚拟经度
np.full(len(depths_vp), 25.0), # 虚拟纬度
depths_vp,
vpvs_ratio
])
converter_vpvs = Velocity3Dto1D(data_array=vpvs_data, velocity_type='VpVs')
# Vp/Vs质量检查
qc_vpvs = converter_vpvs.quality_check(depths_vp, vpvs_ratio)
9.3 批处理多个区域
# 定义多个区域
regions = {
'北部': (100, 102, 25, 27),
'南部': (100, 102, 23, 25),
'东部': (102, 104, 24, 26),
'西部': (98, 100, 24, 26)
}
# 处理每个区域
results = {}
for region_name, bounds in regions.items():
print(f"处理区域: {region_name}")
depths, velocities = converter.extract_1d_velocity(
method='weighted_mean',
region=bounds
)
# 插值
depths_i, vel_i = converter.interpolate_1d_model(depth_interval=1.0)
# 保存
converter.save_1d_model(
f'velocity_1d_{region_name}.dat',
depths_i, vel_i
)
results[region_name] = (depths_i, vel_i)
# 对比各区域
plt.figure(figsize=(10, 8))
for region_name, (depths, vels) in results.items():
plt.plot(vels, depths, label=region_name)
plt.xlabel('速度 (km/s)')
plt.ylabel('深度 (km)')
plt.title('区域一维速度模型对比')
plt.legend()
plt.gca().invert_yaxis()
plt.grid(True, alpha=0.3)
plt.savefig('区域对比.png')
程序下载地址: https://github.com/zhangsuxiang/3D-to-1D-Velocity-Model-Converter
相关推荐
- NAS下搭建FastGpt,一个基于 LLM 大语言模型的知识库问答系统
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:熊猫不是猫QAQ前言FastGPT是一个基于LLM大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过Flow可...
- MongoDB入门实操《二》_mongodb从入门到商业实战
-
常规命令使用首先我们来了解几个概念,虽然MongoDB入门实操《上篇》这篇文章已经提到过,这里再次加深印象:集合:Mongo中的集合就是mysql的表的表现形式文档:文档的数据结构和JSON基本...
- Go语言零到一:数据库交互_go语言数据库连接池
-
引言Go语言的database/sql包为开发者提供了一个抽象层,使得与MySQL数据库的交互变得更加容易。1.安装MySQL驱动为了能够与MySQL数据库通信,我们需要安装go...
- Java中使用MongoDB数据库_java操作mongo
-
一、Java实现对MongDB的操作1、前提条件除了通过启动mongo进程进如Shell环境访问数据库外,MongoDB还提供了其他基于编程语言的访问数据库方法。MongoDB官方提...
- Spring Boot 集成 MongoDB:从入门到生产实践
-
1、MongoDB简介MongoDB是一个开源的、面向文档的NoSQL数据库,旨在提供高性能、高可用性和易扩展性。它与传统的关系型数据库(如MySQL)有着根本性的区别。面向文档(Docum...
- 发现一个不错的库推荐给大家:DuckDB + Python + Pandas 量化研究利器
-
大家好,我是花姐。最近折腾数据处理的时候,发现了一个宝藏库——DuckDB,配合Python和Pandas简直不要太香!今天我就聊聊它到底有多好用,特别适合我们搞量化研究的同学。1.Duck...
- SpringBoot 自研「轻量级 API 防火墙」:单机内嵌,支持在线配置
-
1.背景与痛点在做后端开发时,我们常常会遇到这样的困境:接口被恶意刷流量:比如某个查询接口被短时间大量调用,数据库连接数打满,最终拖垮整个服务。缺少细粒度防护能力:很多系统只有粗糙的全局限流,但某些...
- 福建新画卷,把福建成绩“画”给你看
-
·x-_p-_o-[U2FsdGVkX1/DHR1fwp5qMkbHvRjusk9BgvDHM/8zbH+7Z+bZnW0jD3Vk67FnKGbJHp2L4vKFqg7ryQ7Zadr0+p+82E...
- [续]江西话汉语赣方言之叠词_江西话什么意思
-
一、赣语耒阳话每次去湖南耒阳,老俵听到我是江西人,都分外亲切:“我们祖上是从江西迁过来的!”在得知明朝初年湖广因战乱赤地千里,耒阳人祖上大都从江西永新迁来后,我就特别留意耒阳方言:耒阳话不仅保留了老...
- SpringBoot 在线依赖包漏洞扫描仪,一键发现潜在安全漏洞
-
在日常项目开发中,依赖第三方库几乎是不可避免的。从spring-boot-starter到MyBatis、Log4j,再到各种工具类库,几乎每个应用都需要几十甚至上百个依赖。然而,这些依赖并非完...
- 一文学会Python的变量命名规则!_简述python变量命名规则
-
目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...
- Python中8种Functools使用方法_python functools.partial
-
在本文中,我们来看看functools标准库模块以及您可以用它做的6件很酷的事情1.缓存可以使用@cache装饰器(以前称为@lru_cache)作为“简单的轻量级无界函数缓存”。典型的例子是...
- 每天5分钟,python 速成(59)_python速成视频教程
-
首先明确学习目标,今天的目标是python中模块学习模块模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块importrandomimportmath#数学相...
- 珍藏版-11款爱心的免费公布的数学方程式和可视化-python版
-
一,图:1直角坐标系(9款):2追加一款:直角坐标系:3极坐标系(1款):二,爱心的数学方程式:1直角坐标系:1.1方程式1:Love-1进行转换:python代码中需要进行修改为:x=...
- 12种不同方法教你用Python性能优化!(建议收藏)
-
前言:今天为大家带来的内容是12种不同方法教你用Python性能优化!希望通过本文的内容能够帮助到各位!(代码块是用图片的方式呈现出来)1.减少冗余数据如用上三角或下三角的方式去保存一个大的对称矩阵。...
- 一周热门
- 最近发表
-
- NAS下搭建FastGpt,一个基于 LLM 大语言模型的知识库问答系统
- MongoDB入门实操《二》_mongodb从入门到商业实战
- Go语言零到一:数据库交互_go语言数据库连接池
- Java中使用MongoDB数据库_java操作mongo
- Spring Boot 集成 MongoDB:从入门到生产实践
- 发现一个不错的库推荐给大家:DuckDB + Python + Pandas 量化研究利器
- SpringBoot 自研「轻量级 API 防火墙」:单机内嵌,支持在线配置
- 福建新画卷,把福建成绩“画”给你看
- [续]江西话汉语赣方言之叠词_江西话什么意思
- SpringBoot 在线依赖包漏洞扫描仪,一键发现潜在安全漏洞
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)