AgentSkillsCN

segyio

读取、写入并操作SEG-Y地震数据文件。该库采用高效的C语言实现,并通过Python绑定提供对道、头、内线与横线数据的快速访问。当Claude需要执行以下操作时使用:(1) 读取/检查SEG-Y文件;(2) 提取道数据或头信息;(3) 通过内线/横线访问三维测线数据;(4) 从数组创建新的SEG-Y文件;(5) 修改现有SEG-Y文件;(6) 提取地震数据的子集;(7) 读写Seismic Unix格式数据。

SKILL.md
--- frontmatter
name: segyio
description: |
  Read, write, and manipulate SEG-Y seismic data files. Fast C library with Python
  bindings for trace, header, inline, and crossline access. Use when Claude needs to:
  (1) Read/inspect SEG-Y files, (2) Extract trace data or headers, (3) Access 3D survey
  data by inline/crossline, (4) Create new SEG-Y files from arrays, (5) Modify existing
  SEG-Y files, (6) Extract subsets of seismic data, (7) Read/write Seismic Unix format.

segyio - SEG-Y Seismic Data

Quick Reference

python
import segyio

# Read
with segyio.open('seismic.sgy', 'r') as f:
    print(f.tracecount, len(f.samples))
    trace0 = f.trace[0]              # Single trace as numpy array
    data = segyio.tools.collect(f.trace[:])  # All traces

# 3D access (specify inline/xline byte locations)
with segyio.open('seismic.sgy', 'r', iline=189, xline=193) as f:
    inline_100 = f.iline[100]        # 2D array (xlines x samples)
    cube = segyio.tools.cube(f)      # Full 3D cube

# Write
spec = segyio.spec()
spec.samples = samples
spec.tracecount = n_traces
with segyio.create('output.sgy', spec) as f:
    f.trace[0] = data

Key Access Modes

ModeDescription
f.trace[i]Sequential trace access by index
f.header[i]Trace header access (dict-like)
f.iline[n]Inline slice (3D surveys)
f.xline[n]Crossline slice (3D surveys)
f.depth_slice[n]Horizontal time/depth slice
f.text[0]Text header (3200 bytes)
f.binBinary header

Essential Operations

Open and Inspect

python
with segyio.open('seismic.sgy', 'r') as f:
    print(f"Traces: {f.tracecount}")
    print(f"Samples: {len(f.samples)}")
    print(f"Sample interval: {f.samples[1] - f.samples[0]} ms")
    if f.ilines is not None:
        print(f"Inlines: {f.ilines}")
        print(f"Crosslines: {f.xlines}")

Read Trace Headers

python
with segyio.open('seismic.sgy', 'r') as f:
    header = f.header[0]
    print(header[segyio.TraceField.INLINE_3D])
    print(header[segyio.TraceField.CDP_X])

    # Get all values for one field
    inlines = f.attributes(segyio.TraceField.INLINE_3D)[:]

Read 3D Data

python
with segyio.open('seismic.sgy', 'r', iline=189, xline=193) as f:
    inline_data = f.iline[100]       # Shape: (n_xlines, n_samples)
    xline_data = f.xline[200]        # Shape: (n_ilines, n_samples)
    time_slice = f.depth_slice[250]  # Shape: (n_ilines, n_xlines)
    cube = segyio.tools.cube(f)      # Shape: (ilines, xlines, samples)

Read Unstructured Data

python
# For 2D lines or unsorted data
with segyio.open('seismic.sgy', 'r', ignore_geometry=True) as f:
    data = segyio.tools.collect(f.trace[:])

Create New SEG-Y

python
import numpy as np

spec = segyio.spec()
spec.samples = np.arange(500) * 4  # 4ms sample rate
spec.tracecount = 100
spec.format = 1  # IBM float

with segyio.create('output.sgy', spec) as f:
    for i in range(100):
        f.trace[i] = data[i]
        f.header[i] = {
            segyio.TraceField.TRACE_SEQUENCE_LINE: i + 1,
        }

Modify Existing File

python
with segyio.open('seismic.sgy', 'r+') as f:
    f.trace[0] = f.trace[0] * 2.0
    f.header[0][segyio.TraceField.CDP] = 999

Data Formats

CodeFormat
1IBM 4-byte float
24-byte signed integer
32-byte signed integer
5IEEE 4-byte float
81-byte signed integer

Common Issues

IssueSolution
Geometry not detectedSpecify iline= and xline= byte positions
Can't read 3D slicesUse ignore_geometry=True for unstructured data
Wrong inline/xline bytesCheck headers with f.header[0] to find correct bytes
File not openingCheck file path, permissions, and SEG-Y format validity

References

Scripts