1

7 行の csv ファイルがあり、そのうち 5 行には 7 列があり、最後の 2 列には 2 列があります。これらのファイルも、文字列、浮動小数点数、および NaN が混在しています。例えば:

883825.00,373395.00,0.00,"20,080.84",2012500.00,#EANF#,121449.39
0.00,0.00,0.00,"38,849.10",0.00,#EANF#,0.00
0.00,0.00,0.00,"83,167.42",1640625.00,#EANF#,0.00
#EANF#,#EANF#,#EANF#,#EANF#,#EANF#,#EANF#,#EANF#
"-1,202,600.00",-0.00,#EANF#,2267168,0.00,#EANF#,"-173,710.66"
-125.60,#EANF#
"17,459.68",#EANF#.

MATLAB を使用してこのファイルを読み取り、作業することができました。numpyでも同じことができますか?このフォーラムで解決策を探してみましたが、何もうまくいかないようです。文字列と NaN を float に変換する必要があります。

4

1 に答える 1

1

NumPy を使用した解決策があるかどうかはわかりませんがloadtxtgenfromtxt列数が変わるとそれぞれエラーと警告が発生するため、おそらく独自のメソッドを作成する必要があります。

編集: 以下は、DSM のコメントを反映するためにわずかに編集されました。

組み込みcsvモジュールを使用できます:

import csv

arr = []

with open('test.txt', 'r') as fh:
    reader = csv.reader(fh)
    for row in reader:
        if row:
            arr.extend(row)

fileobj = open(...)csv アプローチには、改行を削除するという利点がありますが、 andを使用してファイルを読み取るだけの場合はそうではありませんfor line in fileobj

この時点で、あなたは持っているべきです

>>> arr
['883825.00', '373395.00', '0.00', '20,080.84', '2012500.00', '#EANF#', '121449.
39', '0.00', '0.00', '0.00', '38,849.10', '0.00', '#EANF#', '0.00', '0.00', '0.0
0', '0.00', '83,167.42', '1640625.00', '#EANF#', '0.00', '#EANF#', '#EANF#', '#E
ANF#', '#EANF#', '#EANF#', '#EANF#', '#EANF#', '-1,202,600.00', '-0.00', '#EANF#
', '2267168', '0.00', '#EANF#', '-173,710.66', '-125.60', '#EANF#', '17,459.68',
 '#EANF#.']

次に、浮動小数点数に変換し、#EANF#値をたとえば に置き換える必要がありますnumpy.NaN。一部の値のコンマにも注意する必要があります。コンマは簡単に処理できます

float(str(float_string).replace(',', ''))

値については#EANF#、項目がこれで始まるかどうかを確認できます (リストの最後の項目には末尾の があるため、これと等しくありません.)。これら 2 つの変換を関数に結合convertし、リスト内包表記でラップすると、次のようになります。

import numpy

def convert(v):
    try:
        return float(v)
    except ValueError:
        if v.startswith('#EANF#'):
            return numpy.NaN
        else:
            return float(str(v).replace(',', ''))

arr = numpy.asarray([convert(a) for a in arr])

この関数convertは、どの値を にマッピングするかを定義する 2 番目のオプションの引数を取るように一般化できますnumpy.NaN

これの最終結果は

>>> arr
[883825.0, 373395.0, 0.0, 20080.84, 2012500.0, nan, 121449.39, 0.0, 0.0, 0.0, 38
849.1, 0.0, nan, 0.0, 0.0, 0.0, 0.0, 83167.42, 1640625.0, nan, 0.0, nan, nan, na
n, nan, nan, nan, nan, -1202600.0, -0.0, nan, 2267168.0, 0.0, nan, -173710.66, -
125.6, nan, 17459.68, nan]

注: この回答は、結果として 1 次元のリストに満足していることを前提としています。結果に別の形状が必要な場合は、質問でそのように言う必要があります。

于 2012-06-07T12:50:44.817 に答える