2016-10-05 9 views
1

私はF2PYでラップした従来のFortranライブラリを持っています。しかし、私はPythonからモジュールデータとして宣言された文字配列を正しく読み込む方法を失っています。データデータは通過しますが、配列は見分けがつかないように転置されます。 Numpyにアレイを正しく処理させるにはどうすればよいですか?彼らが理解できる順序であれば、2次元の文字配列に満足しているだろう。 (3.4 Pythonの今F2PYを使用したPythonのFortran文字配列の処理

x = numpy.frombuffer(fvslib.plot_mod.jsp.data, numpy.dtype('a4')) 

をしかし:

文字配列を宣言し、そのようにFortranのに移入されています

module plot_mod 
    implicit none 

    CHARACTER*4, JSP(39) 

    ... 

    JSP = (/ & 
     'SF ', 'WF ', 'GF ', 'AF ', 'RF ', 'SS ', 'NF ', & 
     'YC ', 'IC ', 'ES ', 'LP ', 'JP ', 'SP ', 'WP ', & 
     'PP ', 'DF ', 'RW ', 'RC ', 'WH ', 'MH ', 'BM ', & 
     'RA ', 'WA ', 'PB ', 'GC ', 'AS ', 'CW ', 'WO ', & 
     'WJ ', 'LL ', 'WB ', 'KP ', 'PY ', 'DG ', 'HT ', & 
     'CH ', 'WI ', ' ', 'OT '/) 

end module plot_mod 

のPython 2.7(numpyの以前のバージョン)では、私はこれを行うことができます。 4)とNumpy(1.10.4)はエラーを発生させます、BufferError: memoryview: underlying buffer is not C-contiguous

私は、ナンプーが私のためにこれを再構成したり、ストライドトリックを使って処理することができるはずですが、私はそれを理解できないようです。配列はF連続であると報告されているので、少なくとも正しいと思われる。私は単純に配列を印刷する場合

が、それは次のようになります。私はこのような配列たい何

array([[b'S', b' ', b' ', b'L'], 
    [b'F', b'L', b' ', b' '], 
    [b' ', b'P', b'B', b' '], 
    [b' ', b' ', b'M', b'W'], 
    [b'W', b' ', b' ', b'B'], 
    [b'F', b'J', b' ', b' '], 
    [b' ', b'P', b'R', b' '], 
    [b' ', b' ', b'A', b'K'], 
    [b'G', b' ', b' ', b'P'], 
    [b'F', b'S', b' ', b' '], 
    [b' ', b'P', b'W', b' '], 
    [b' ', b' ', b'A', b'P'], 
    [b'A', b' ', b' ', b'Y'], 
    [b'F', b'W', b' ', b' '], 
    [b' ', b'P', b'P', b' '], 
    [b' ', b' ', b'B', b'D'], 
    [b'R', b' ', b' ', b'G'], 
    [b'F', b'P', b' ', b' '], 
    [b' ', b'P', b'G', b' '], 
    [b' ', b' ', b'C', b'H'], 
    [b'S', b' ', b' ', b'T'], 
    [b'S', b'D', b' ', b' '], 
    [b' ', b'F', b'A', b' '], 
    [b' ', b' ', b'S', b'C'], 
    [b'N', b' ', b' ', b'H'], 
    [b'F', b'R', b' ', b' '], 
    [b' ', b'W', b'C', b' '], 
    [b' ', b' ', b'W', b'W'], 
    [b'Y', b' ', b' ', b'I'], 
    [b'C', b'R', b' ', b' '], 
    [b' ', b'C', b'W', b' '], 
    [b' ', b' ', b'O', b' '], 
    [b'I', b' ', b' ', b' '], 
    [b'C', b'W', b' ', b' '], 
    [b' ', b'H', b'W', b' '], 
    [b' ', b' ', b'J', b'O'], 
    [b'E', b' ', b' ', b'T'], 
    [b'S', b'M', b' ', b' '], 
    [b' ', b'H', b'L', b' ']], 
    dtype='|S1') 

[['SF '] 
, ['WF '] 
, ['GF '] 
, ['AF '] 
, ['RF '] 
, ['SS '] 
, ['NF '] 
, ['YC '] 
, ['IC '] 
, ['ES '] 
, ['LP '] 
, ['JP '] 
, ['SP '] 
, ['WP '] 
, ['PP '] 
, ['DF '] 
, ['RW '] 
, ['RC '] 
, ['WH '] 
, ['MH '] 
, ['BM '] 
, ['RA '] 
, ['WA '] 
, ['PB '] 
, ['GC '] 
, ['AS '] 
, ['CW '] 
, ['WO '] 
, ['WJ '] 
, ['LL '] 
, ['WB '] 
, ['KP '] 
, ['PY '] 
, ['DG '] 
, ['HT '] 
, ['CH '] 
, ['WI '] 
, [' '] 
, ['OT ']] 

答えて

1

私はあなたのモジュール上f2pyを実行しようとしていないが、しかし、配列を定義すると、次のように表示されます:

In [11]: s = array([[b'S', b' ', b' ', b'L'], 
    ...: [b'F', b'L', b' ', b' '], 
    ...: [b' ', b'P', b'B', b' '], 
    ...: [b' ', b' ', b'M', b'W'], 
    ...: [b'W', b' ', b' ', b'B'], 
    ...: [b'F', b'J', b' ', b' '], 
    ...: [b' ', b'P', b'R', b' '], 
    ...: [b' ', b' ', b'A', b'K'], 
    ...: [b'G', b' ', b' ', b'P'], 
    ...: [b'F', b'S', b' ', b' '], 
    ...: [b' ', b'P', b'W', b' '], 
    ...: [b' ', b' ', b'A', b'P'], 
    ...: [b'A', b' ', b' ', b'Y'], 
    ...: [b'F', b'W', b' ', b' '], 
    ...: [b' ', b'P', b'P', b' '], 
    ...: [b' ', b' ', b'B', b'D'], 
    ...: [b'R', b' ', b' ', b'G'], 
    ...: [b'F', b'P', b' ', b' '], 
    ...: [b' ', b'P', b'G', b' '], 
    ...: [b' ', b' ', b'C', b'H'], 
    ...: [b'S', b' ', b' ', b'T'], 
    ...: [b'S', b'D', b' ', b' '], 
    ...: [b' ', b'F', b'A', b' '], 
    ...: [b' ', b' ', b'S', b'C'], 
    ...: [b'N', b' ', b' ', b'H'], 
    ...: [b'F', b'R', b' ', b' '], 
    ...: [b' ', b'W', b'C', b' '], 
    ...: [b' ', b' ', b'W', b'W'], 
    ...: [b'Y', b' ', b' ', b'I'], 
    ...: [b'C', b'R', b' ', b' '], 
    ...: [b' ', b'C', b'W', b' '], 
    ...: [b' ', b' ', b'O', b' '], 
    ...: [b'I', b' ', b' ', b' '], 
    ...: [b'C', b'W', b' ', b' '], 
    ...: [b' ', b'H', b'W', b' '], 
    ...: [b' ', b' ', b'J', b'O'], 
    ...: [b'E', b' ', b' ', b'T'], 
    ...: [b'S', b'M', b' ', b' '], 
    ...: [b' ', b'H', b'L', b' ']], 
    ...: dtype='|S1') 

私はあなたが望むように見える配列を得ることができます:

In [12]: s.T.reshape(-1, 4).view('S4') 
Out[12]: 
array([[b'SF '], 
     [b'WF '], 
     [b'GF '], 
     [b'AF '], 
     [b'RF '], 
     [b'SS '], 
     [b'NF '], 
     [b'YC '], 
     [b'IC '], 
     [b'ES '], 
     [b'LP '], 
     [b'JP '], 
     [b'SP '], 
     [b'WP '], 
     [b'PP '], 
     [b'DF '], 
     [b'RW '], 
     [b'RC '], 
     [b'WH '], 
     [b'MH '], 
     [b'BM '], 
     [b'RA '], 
     [b'WA '], 
     [b'PB '], 
     [b'GC '], 
     [b'AS '], 
     [b'CW '], 
     [b'WO '], 
     [b'WJ '], 
     [b'LL '], 
     [b'WB '], 
     [b'KP '], 
     [b'PY '], 
     [b'DG '], 
     [b'HT '], 
     [b'CH '], 
     [b'WI '], 
     [b' '], 
     [b'OT ']], 
     dtype='|S4') 

データ型は、Fortran配列の宣言されたサイズと一致するように'S4'であることに注意してください。

この結果は、2番目のディメンションが残っているため、1次元の配列に変換したい場合があります。

In [22]: s.T.reshape(-1, 4).view('S4')[:,0] 
Out[22]: 
array([b'SF ', b'WF ', b'GF ', b'AF ', b'RF ', b'SS ', b'NF ', 
     b'YC ', b'IC ', b'ES ', b'LP ', b'JP ', b'SP ', b'WP ', 
     b'PP ', b'DF ', b'RW ', b'RC ', b'WH ', b'MH ', b'BM ', 
     b'RA ', b'WA ', b'PB ', b'GC ', b'AS ', b'CW ', b'WO ', 
     b'WJ ', b'LL ', b'WB ', b'KP ', b'PY ', b'DG ', b'HT ', 
     b'CH ', b'WI ', b' ', b'OT '], 
     dtype='|S4') 
+0

パーフェクト。移調は私が欠けていた鍵です。投稿した直後、私はstride_tricksモジュールでそれを行う方法を考え出しましたが、これははるかに優れたIMHOです。 – tharen

0

完全性のために、この代替ソリューションを取り上げます。 @Warren Weckesserと同じ結果ですが、追加のインポートが必要です。

from numpy.lib import stride_tricks 

spp = stride_tricks.as_strided(jsp, strides=(jsp.shape[1],1)) 

# View as S4 and strip whitespace 
spp = np.char.strip(spp.view('S4')) 
関連する問題