公式ドキュメントは 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 を構築するには、次のものが必要です。
ドキュメントを構築するには、sphinx も必要です
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
root として実行する必要があります。ホーム ディレクトリにインストールする場合は、 -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
に置き換えるだけで十分です。
テストは language/tests ディレクトリにあり、追加された新機能の正確性と契約性をテストを追加することで実証することを強くお勧めします。すべてのテストは、 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 関数の docstring を確認してください。最も重要なオプションは 2 番目 (オプション) の位置引数です。書き込み用にファイルを開くには、 segyio.open(filename, 'r+')
、C のfopen
関数から。
ファイルは非構造化モードで開くことができます。 segyio.open
にオプションの引数strict=False
渡すことによって (この場合、構造 (インライン番号、クロスライン番号など) を確立しないことはエラーではありません)、またはignore_geometry=True
(この場合、segyio) を渡すことができます。これらの内部属性を設定しようとすることさえありません。
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
の代わりにヘッダー オブジェクトが生成されます。ヘッダーは dict のようなオブジェクトで、キーは整数、耐震 Unix スタイルのキー (segyio.su モジュール内)、および segyio 列挙型 (segyio.TraceField) です。
ヘッダー値は、辞書に似たものを割り当てることで更新でき、割り当ての右側に存在しないキーは変更されません。
> >> 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
プロパティで確認できます。
トレースと同様に、1 行を取得すると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
辞書のようなインターフェイスを備えたファイル全体のバイナリ ヘッダーの値。 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 ))
その他の例とレシピは、docstrings help(segyio)
と例のセクションにあります。
Segyio は、必ずしも SEG-Y インタラクションの最終的な役割を果たすことを目指しているわけではありません。むしろ、埋め込み、新しいアプリケーション、または自立型プログラムのために SEG-Y ファイルを操作する障壁を下げることを目指しています。
さらに、その目的は、完全な標準またはすべての特殊な (ただし標準に準拠した) 形式のファイルをサポートすることではありません。次のようないくつかの仮定が行われます。
現在、segyio は以下をサポートしています。
segyio の書き込み機能は主に、ファイルを変更または調整することを目的としています。 segyio がジオメトリを理解するために必要なヘッダー フィールドのみを記述する必要があるため、最初から作成したファイルは必ずしも仕様どおりの SEG-Y ファイルであるとは限りません。 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 ファイルは、フリップエンディアン プログラムを実行することによって作成されました。このプログラムは segyio ソース ツリーに含まれていますが、パッケージの一部ではなく、配布やインストールを目的としたものではなく、テスト ファイルの再現のみを目的としています。
耐震性 UNIX ファイル 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 ]
scrach から 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 は単なるトレースのコレクションであるファイルもサポートしていますが、そうしても問題ないことを伝える必要があります。 segyio.open
にstrict = False
またはignore_geometry = True
を渡すと、それぞれ非構造化モードを許可または強制できます。 f.iline
および同様の機能は現在無効になっており、エラーが発生することに注意してください。
Segyio は当初、ニーズに合わせて調整できる地震データを操作する無料でシンプルで使いやすい方法として、またフリー ソフトウェア コミュニティへの貢献として Equinor ASA によって作成され、維持されています。