공식 문서는 readthedocs에 호스팅되어 있습니다.
Segyio는 Python 및 Matlab용 언어 바인딩을 통해 SEG-Y 및 Seismic Unix 형식의 지진 데이터와 쉽게 상호 작용할 수 있는 작은 LGPL 라이선스 C 라이브러리입니다. Segyio는 지진 애플리케이션을 위한 사용하기 쉽고 내장 가능하며 커뮤니티 지향적인 라이브러리를 만들려는 시도입니다. 필요에 따라 기능이 추가됩니다. 모든 종류의 제안과 기여를 환영합니다.
최신 개발 및 기능을 확인하려면 변경 로그를 참조하세요. 미래 보장 코드를 작성하려면 계획된 주요 변경 사항을 참조하세요.
segyio가 빌드되고 설치되면 프로그래밍을 시작할 준비가 된 것입니다! 튜토리얼, 예제, 예제 프로그램, 예제 노트북을 확인해 보세요. 예제와 작은 레시피가 포함된 기술 참조를 보려면 문서를 읽어보세요. API 문서는 pydoc에서도 사용할 수 있습니다. 선호하는 Python 인터프리터를 시작하고 help(segyio)
입력하세요. 이는 IDLE, pycharm 및 기타 Python 도구와 잘 통합됩니다.
import segyio
import numpy as np
with segyio . open ( 'file.sgy' ) as f :
for trace in f . trace :
filtered = trace [ np . where ( trace < 1e-2 )]
자세한 내용은 예제를 참조하세요.
segyio 사본은 사전 빌드된 바이너리와 소스 코드로 제공됩니다.
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
segyio를 빌드하려면 다음이 필요합니다.
문서를 작성하려면 스핑크스도 필요합니다.
segyio를 빌드하고 설치하려면 콘솔에서 다음 작업을 수행하세요.
git clone https://github.com/equinor/segyio
mkdir segyio/build
cd segyio/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
make
make install
make install
시스템 설치를 위해 루트로 수행되어야 합니다. 홈 디렉토리에 설치하려면 -DCMAKE_INSTALL_PREFIX=~/
또는 다른 적절한 디렉토리를 추가하거나 make DESTDIR=~/ install
. 환경이 비표준 설치 위치(PYTHONPATH, LD_LIBRARY_PATH 및 PATH)에서 선택되는지 확인하세요.
Python이 여러 개 설치되어 있거나 대체 인터프리터를 사용하려는 경우 설치 접두사 및 빌드 유형과 함께 -DPYTHON_EXECUTABLE=/opt/python/binary
전달하여 cmake가 올바른 인터프리터를 찾는 데 도움을 줄 수 있습니다.
MATLAB 바인딩을 빌드하려면 -DBUILD_MEX=ON
옵션을 사용하여 CMake를 호출하십시오. 일부 환경에서는 Matlab 바이너리가 비표준 위치에 있으며, 이 경우 -DMATLAB_ROOT=/path/to/matlab
전달하여 CMake가 matlab 바이너리를 찾을 수 있도록 도와야 합니다.
더 많은 경고를 받고 개체에 디버그 기호를 포함하려면 디버그 모드에서 빌드하는 것이 좋습니다. CMAKE_BUILD_TYPE
에서 Release
Debug
로 대체하면 충분합니다.
테스트는 언어/테스트 디렉토리에 있으며, 추가된 새로운 기능은 테스트를 추가하여 정확성과 계약성을 입증하는 것이 좋습니다. 모든 테스트는 ctest
호출하여 실행할 수 있습니다. 이미 작성된 테스트를 가이드로 자유롭게 사용해 보세요.
segyio를 빌드한 후 빌드 디렉터리에서 실행되는 ctest
사용하여 테스트를 실행할 수 있습니다.
Python 예제를 실행하려면 Python 라이브러리를 찾을 수 있는 위치를 환경에 알려야 합니다. 사용자로 설치하거나 segyio/build/python 라이브러리를 pythonpath에 추가하여 설치할 수 있습니다.
이 튜토리얼의 모든 코드는 segyio를 가져오고 numpy를 np로 사용할 수 있다고 가정합니다.
import segyio
import numpy as np
이 튜토리얼에서는 여러분이 Python과 numpy에 익숙하다고 가정합니다. 새로 고치려면 Python 튜토리얼과 numpy 빠른 시작을 확인하세요.
읽기 위해 파일을 여는 것은 segyio.open
함수를 사용하여 수행되며 컨텍스트 관리자와 관용적으로 사용됩니다. with
문을 사용하면 예외가 발생하더라도 파일이 제대로 닫힙니다. 기본적으로 파일은 읽기 전용으로 열립니다.
with segyio . open ( filename ) as f :
...
Open은 여러 옵션을 허용합니다(보다 포괄적인 참조를 보려면 help(segyio.open)
으로 open 함수의 독스트링을 확인하세요. 가장 중요한 옵션은 두 번째(선택적) 위치 인수입니다. 쓰기 위해 파일을 열려면 segyio.open(filename, 'r+')
, C fopen
함수에서.
segyio.open
에 선택적 인수 strict=False
전달하여 구조화되지 않은 모드에서 파일을 열 수 있습니다. 이 경우 구조(인라인 번호, 크로스라인 번호 등)를 설정하지 않는 것은 오류가 아니며, segyio의 경우에는 ignore_geometry=True
. 이러한 내부 속성을 설정하려고 시도하지도 않습니다.
segy 파일 객체에는 이 구조를 설명하는 여러 공개 속성이 있습니다.
f.ilines
추론된 인라인 번호f.xlines
추정된 크로스라인 번호f.offsets
추론된 오프셋 번호f.samples
추론된 샘플 오프셋(주파수 및 기록 시간 지연)f.unstructured
구조화되지 않은 경우 True, 구조화된 경우 Falsef.ext_headers
확장된 텍스트 헤더의 수 파일이 구조화되지 않은 상태로 열리면 모든 선 속성은 None
됩니다.
segyio에서는 소위 모드를 통해 데이터를 검색하고 기록합니다. 모드는 추상 배열 또는 주소 지정 체계이며 이름과 인덱스의 의미를 변경합니다. 모든 모드는 파일 핸들 객체의 속성이고 len
함수를 지원하며 읽기 및 쓰기는 f.mode[]
를 통해 수행됩니다. 쓰기는 할당으로 수행됩니다. 모드는 numpy에서 영감을 받은 배열 슬라이싱을 지원합니다. 다음 모드를 사용할 수 있습니다:
trace
추적 모드는 파일에 배치된 대로 추적의 원시 주소 지정을 제공합니다. 이는 header
와 함께 구조화되지 않은 파일에 사용할 수 있는 유일한 모드입니다. 추적은 0..len(f.trace)
으로 열거됩니다.
트레이스를 읽으면 numpy ndarray
생성되고 여러 트레이스를 읽으면 ndarray
생성기가 생성됩니다. 생성기 의미 체계가 사용되며 동일한 개체가 재사용되므로 나중에 추적 데이터를 캐시하거나 주소를 지정하려면 명시적으로 복사해야 합니다.
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
trace
와 유사한 주소 지정 동작을 통해 항목에 액세스하면 numpy ndarray
대신 헤더 객체가 생성됩니다. 헤더는 키가 정수, 지진 유닉스 스타일 키(segyio.su 모듈에 있음) 및 segyio 열거형(segyio.TraceField)인 dict와 유사한 객체입니다.
헤더 값은 dict와 유사한 항목을 할당하여 업데이트할 수 있으며 할당 오른쪽에 없는 키는 수정 되지 않습니다.
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
, xline
이러한 모드에서는 파일이 구조화되지 않은 경우 오류가 발생합니다. []
에 대한 인수를 해당 행의 키로 간주합니다. 줄 번호는 항상 증가하지만 간격이 임의로 일정하지 않을 수 있습니다. 유효한 이름은 ilines
및 xlines
속성에서 찾을 수 있습니다.
추적과 마찬가지로 한 줄을 얻으면 ndarray
생성되고, 줄 조각을 얻으면 ndarray
생성기가 생성됩니다. 단계가 있는 슬라이스를 사용할 때 단계와 일치하지 않으면 일부 중간 항목을 건너뛸 수 있습니다. 즉 [1,2,3,4,5]
행이 있는 파일에서 f.line[1:10:3]
수행하는 경우입니다. 1, 4, 7
찾아 [1,4]
찾는 것과 같습니다.
4D 사전 스택 파일로 작업할 때 첫 번째 오프셋은 암시적으로 읽혀집니다. 다른 오프셋 또는 범위의 오프셋에 액세스하려면 f.iline[120, 4]
와 같이 쉼표로 구분된 인덱스 또는 범위를 사용하십시오.
fast
, slow
이는 추적이 배치되는 방식에 따라 결정되는 iline
및 xline
의 별칭입니다. 인라인으로 정렬된 파일의 경우 fast
iline
생성합니다.
depth_slice
깊이 슬라이스는 파일 전체에 걸쳐 수평으로 절단된 깊이입니다. 산출된 값은 ndarray
및 배열 생성기입니다.
gather
gather
측량의 수직 열인 인라인과 크로스라인의 교차점이며 단일 오프셋을 지정하지 않는 한 오프셋 x 샘플 ndarray
반환합니다. 범위가 있는 경우 해당 ndarray
의 생성기를 반환합니다.
text
text
모드는 텍스트 헤더의 배열입니다. 여기서 text[0]
은 표준 필수 텍스트 헤더이고 1..n
선택적 확장 헤더입니다.
텍스트 헤더는 파일에 있는 것처럼 3200바이트 바이트 형식의 blob으로 반환됩니다. segyio.tools.wrap
함수는 이 문자열의 줄 지향 버전을 생성할 수 있습니다.
bin
dict와 유사한 인터페이스를 사용하는 파일 전체 바이너리 헤더의 값입니다. header
모드처럼 동작하지만 인덱싱이 없습니다.
> >> for line in f . iline [: 2430 ]:
... print ( np . average ( line ))
> >> for line in f . xline [ 2 : 10 ]:
... print ( line )
> >> for line in f . fast [:: 2 ]:
... print ( np . min ( line ))
> >> for factor , offset in enumerate ( f . iline [ 10 , :]):
... offset *= factor
print ( offset )
> >> f . gather [ 200 , 241 , :]. shape
> >> text = f . text [ 0 ]
> >> type( text )
< type 'bytes' >
> >> f . trace [ 10 ] = np . zeros ( len ( f . samples ))
더 많은 예제와 레시피는 독스트링 help(segyio)
과 예제 섹션에서 찾을 수 있습니다.
Segyio는 반드시 SEG-Y 상호 작용의 최종 목표가 되려고 시도하지는 않습니다. 오히려 우리는 임베딩, 새로운 애플리케이션 또는 독립 프로그램을 위해 SEG-Y 파일과 상호 작용하는 장벽을 낮추는 것을 목표로 합니다.
또한 목표는 전체 표준 또는 모든 이국적인(그러나 표준 호환) 형식의 파일을 지원하는 것이 아닙니다. 다음과 같은 몇 가지 가정이 이루어집니다.
현재 segyio는 다음을 지원합니다.
segyio의 쓰기 기능은 주로 파일을 수정 하거나 조정하는 것을 의미합니다. 처음부터 생성된 파일은 반드시 사양에 맞는 SEG-Y 파일일 필요는 없습니다. segyio가 기하학을 이해하는 데 필요한 헤더 필드만 작성해야 하기 때문입니다. SEG-Y 파일을 사양에 따라 유지 관리하고 작성하는 것이 여전히 강력히 권장되지만 segyio는 이를 강제 하지 않습니다 .
Segyio는 SEG-Y와 유사한 많은 파일을 처리할 수 있습니다. 즉, segyio는 SEG-Y 표준을 엄격하게 준수하지 않는 파일을 처리합니다. Segyio는 또한 개정판을 구별하지 않고 대신 파일에서 사용 가능한 정보를 사용하려고 시도합니다. 실제 표준을 참조하려면 SEG의 간행물을 참조하세요.
우리는 모든 종류의 기여를 환영합니다. CONTRIBUTING.md를 참조하세요.
xarray
통합Alan Richardson은 segy 파일과 함께 xarray를 사용하기 위한 훌륭하고 작은 도구를 작성했으며 이 노트북에서 이를 시연합니다.
테스트 목적으로 작은 SEG-Y 형식의 파일이 저장소에 포함되어 있습니다. 데이터는 무의미하고 예측 가능하도록 만들어졌으며 segyio를 사용하여 재현 가능합니다. 테스트 파일은 test-data 디렉터리에 있습니다. 데이터 파일을 재현하려면 segyio를 빌드하고 테스트 프로그램 make-file.py
, make-ps-file.py
및 make-rotated-copies.py
다음과 같이 실행하십시오.
python examples / make - file . py small . sgy 50 1 6 20 25
python examples / make - ps - file . py small - ps . sgy 10 1 5 1 4 1 3
python examples / make - rotated - copies . py small . sgy
small-lsb.sgy 파일은 Flip-Endianness 프로그램을 실행하여 생성되었습니다. 이 프로그램은 segyio 소스 트리에 포함되어 있지만 패키지의 일부는 아니며 배포 및 설치용이 아니며 테스트 파일 재생에만 사용됩니다.
지진 유닉스 파일 small.su 및 small-lsb.su는 다음 명령으로 생성되었습니다.
segyread tape=small.sgy ns=50 remap=tracr,cdp byte=189l,193l conv=1 format=1
> small-lsb.su
suswapbytes < small.su > small-lsb.su
무료 라이센스가 포함된 작은 데이터 파일이 있다면 자유롭게 프로젝트에 제출해 주세요!
유용한 라이브러리 가져오기:
import segyio
import numpy as np
from shutil import copyfile
segy 파일을 열고 검사합니다.
filename = 'name_of_your_file.sgy'
with segyio . open ( filename ) as segyfile :
# Memory map file for faster reading (especially if file is big...)
segyfile . mmap ()
# Print binary header info
print ( segyfile . bin )
print ( segyfile . bin [ segyio . BinField . Traces ])
# Read headerword inline for trace 10
print ( segyfile . header [ 10 ][ segyio . TraceField . INLINE_3D ])
# Print inline and crossline axis
print ( segyfile . xlines )
print ( segyfile . ilines )
segy 파일에 포함된 스택 후 데이터 큐브를 읽습니다.
# Read data along first xline
data = segyfile . xline [ segyfile . xlines [ 1 ]]
# Read data along last iline
data = segyfile . iline [ segyfile . ilines [ - 1 ]]
# Read data along 100th time slice
data = segyfile . depth_slice [ 100 ]
# Read data cube
data = segyio . tools . cube ( filename )
segy 파일에 포함된 스택 전 데이터 큐브를 읽습니다.
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename ) as segyfile :
# Print offsets
print ( segyfile . offset )
# Read data along first iline and offset 100: data [nxl x nt]
data = segyfile . iline [ 0 , 100 ]
# Read data along first iline and all offsets gath: data [noff x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 1 , :]])
# Read data along first 5 ilines and all offsets gath: data [noff nil x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 5 , :]])
# Read data along first xline and all offsets gath: data [noff x nil x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . xline [ 0 : 1 , :]])
상당히 '구조화되지 않은' 데이터(예: 일반적인 샷 수집으로 정렬된 데이터)를 읽고 이해합니다.
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename , ignore_geometry = True ) as segyfile :
segyfile . mmap ()
# Extract header word for all traces
sourceX = segyfile . attributes ( segyio . TraceField . SourceX )[:]
# Scatter plot sources and receivers color-coded on their number
plt . figure ()
sourceY = segyfile . attributes ( segyio . TraceField . SourceY )[:]
nsum = segyfile . attributes ( segyio . TraceField . NSummedTraces )[:]
plt . scatter ( sourceX , sourceY , c = nsum , edgecolor = 'none' )
groupX = segyfile . attributes ( segyio . TraceField . GroupX )[:]
groupY = segyfile . attributes ( segyio . TraceField . GroupY )[:]
nstack = segyfile . attributes ( segyio . TraceField . NStackedTraces )[:]
plt . scatter ( groupX , groupY , c = nstack , edgecolor = 'none' )
다른 파일의 동일한 헤더를 사용하여 segy 파일을 작성하지만 데이터에 *2를 곱합니다.
input_file = 'name_of_your_input_file.sgy'
output_file = 'name_of_your_output_file.sgy'
copyfile ( input_file , output_file )
with segyio . open ( output_file , "r+" ) as src :
# multiply data by 2
for i in src . ilines :
src . iline [ i ] = 2 * src . iline [ i ]
sctrach에서 segy 파일 만들기
filename='name_of_your_file.sgy'
% Inspect segy
Segy_struct=SegySpec(filename,189,193,1);
% Read headerword inline for each trace
Segy.get_header(filename,'Inline3D')
%Read data along first xline
data= Segy.readCrossLine(Segy_struct,Segy_struct.crossline_indexes(1));
%Read cube
data=Segy.get_cube(Segy_struct);
%Write segy, use same header but multiply data by *2
input_file='input_file.sgy';
output_file='output_file.sgy';
copyfile(input_file,output_file)
data = Segy.get_traces(input_file);
data1 = 2*data;
Segy.put_traces(output_file, data1);
특히 새 파일을 생성할 때 segyio의 성능에 어려움을 겪는 경우 문제가 자주 발생합니다. 범인은 종종 다음 코드입니다.
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
코드 자체는 완벽하지만 파일이 새로 생성될 때 일부 시스템에서는 미묘한 동작이 있습니다. 즉, 희소 파일에 여러 번 분산된 쓰기를 수행합니다. 이는 주로 파일 시스템에 따라 빠르거나 느릴 수 있습니다.
파일에 연속적으로 쓰도록 루프를 다시 작성합니다.
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
파일이 추적 길이를 변경하지 않고 다른 파일의 복사본으로 수정된 경우 먼저 segyio 없이 파일을 복사한 다음 segyio를 사용하여 해당 위치에서 복사본을 수정하는 것이 더 빠르고 쉽습니다.
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
이 오류는 로더가 핵심 segyio 라이브러리를 찾을 수 없을 때 나타납니다. -DCMAKE_INSTALL_PREFIX
를 사용하여 설치 접두사를 명시적으로 설정한 경우 ld.conf.d
파일 또는 LD_LIBRARY_PATH
변수를 사용하여 이 접두사도 찾도록 로더를 구성해야 합니다.
CMAKE_INSTALL_PREFIX
설정하지 않은 경우 cmake는 기본적으로 로더가 일반적으로 알고 있는 /usr/local
에 설치됩니다. Debian 기반 시스템에서 라이브러리는 종종 로더가 알지 못하는 /usr/local/lib
에 설치됩니다. 문제 #239를 참조하세요.
sudo ldconfig
종종 트릭을 수행함)-DCMAKE_INSTALL_LIBDIR=lib64
를 사용하여 설치합니다.이 예외는 파일이 일반 정렬된 3D 볼륨이라는 가정 하에 segyio가 엄격 모드로 열려고 할 때 발생합니다. 파일이 임의의 순서로 된 추적 모음인 경우에는 실패합니다.
segyio.open iline
및 xline
입력 매개변수가 현재 파일에 대해 올바른지 확인하십시오. Segyio는 단지 추적 모음인 파일도 지원하지만 그렇게 해도 괜찮다는 말을 들어야 합니다. strict = False
또는 ignore_geometry = True
segyio.open
에 전달하여 구조화되지 않은 모드를 각각 허용하거나 강제합니다. f.iline
및 유사한 기능은 이제 비활성화되어 오류가 발생합니다.
Segyio는 처음에 Equinor ASA에서 우리의 필요에 맞게 맞춤화할 수 있는 지진 데이터와 상호 작용하는 간단하고 사용하기 쉬운 무료 방법이자 무료 소프트웨어 커뮤니티에 대한 기여로 작성 및 유지 관리됩니다.