0

私はPythonプログラミングにかなり慣れていないので、あなたの答えをとてもシンプルにしてください。

2b/2b complex short int 形式の .raw ファイルがあります。実際には 2D ラスター ファイルです。実部と複雑部の両方を読み分けたい。ラスターが [MxN] サイズであるとしましょう。

質問が明確でない場合はお知らせください。

乾杯N

4

2 に答える 2

2

モジュールでそれを行うことができ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ますが、確実に言えるようにするには、実際のデータと実際にタイミングを合わせて決定する必要があります。

于 2013-01-27T15:09:42.377 に答える
0

Hachoirライブラリを参照してください。この目的のために設計されており、本当にうまく機能します。

于 2013-01-21T15:22:04.493 に答える