私はPythonプログラミングにかなり慣れていないので、あなたの答えをとてもシンプルにしてください。
2b/2b complex short int 形式の .raw ファイルがあります。実際には 2D ラスター ファイルです。実部と複雑部の両方を読み分けたい。ラスターが [MxN] サイズであるとしましょう。
質問が明確でない場合はお知らせください。
乾杯N
私はPythonプログラミングにかなり慣れていないので、あなたの答えをとてもシンプルにしてください。
2b/2b complex short int 形式の .raw ファイルがあります。実際には 2D ラスター ファイルです。実部と複雑部の両方を読み分けたい。ラスターが [MxN] サイズであるとしましょう。
質問が明確でない場合はお知らせください。
乾杯N
モジュールでそれを行うことができstruct
ます。コメントで言及したファイル形式情報に基づく簡単な例を次に示します。
import struct
def read_complex_array(filename, M, N):
row_fmt = '={}h'.format(N) # "=" prefix means integers in native byte-order
row_len = struct.calcsize(row_fmt)
result = []
with open(filename, "rb" ) as input:
for col in xrange(M):
reals = struct.unpack(row_fmt, input.read(row_len))
imags = struct.unpack(row_fmt, input.read(row_len))
cmplx = [complex(r,i) for r,i in zip(reals, imags)]
result.append(cmplx)
return result
これは、私が実行した簡単なテストからのこの出力に見られるように、複素数リストのリストを返します。
[
[ 0.0+ 1.0j 1.0+ 2.0j 2.0+ 3.0j 3.0+ 4.0j],
[256.0+257.0j 257.0+258.0j 258.0+259.0j 259.0+260.0j],
[512.0+513.0j 513.0+514.0j 514.0+515.0j 515.0+516.0j]
]
Python の複素数の実部と虚部は、通常、マシンレベルの倍精度浮動小数点数のペアとして表されます。
array
モジュールを使用することもできます。これを使用して同じことを次に示します。
import array
def read_complex_array2(filename, M, N):
result = []
with open(filename, "rb" ) as input:
for col in xrange(M):
reals = array.array('h')
reals.fromfile(input, N)
# reals.byteswap() # if necessary
imags = array.array('h')
imags.fromfile(input, N)
# imags.byteswap() # if necessary
cmplx = [complex(r,i) for r,i in zip(reals, imags)]
result.append(cmplx)
return result
ご覧のとおり、これらは非常に似ているため、一方を他方よりも使用することに大きな利点があるかどうかは明らかではありません。ベースのバージョンの方が速いのではないかと思いarray
ますが、確実に言えるようにするには、実際のデータと実際にタイミングを合わせて決定する必要があります。
Hachoirライブラリを参照してください。この目的のために設計されており、本当にうまく機能します。