NumPy を使用した解決策があるかどうかはわかりませんがloadtxt
、genfromtxt
列数が変わるとそれぞれエラーと警告が発生するため、おそらく独自のメソッドを作成する必要があります。
編集: 以下は、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 次元のリストに満足していることを前提としています。結果に別の形状が必要な場合は、質問でそのように言う必要があります。