6

前の質問からのアドバイスにもかかわらず:

numpy.genfromtxt() の欠損値として -9999

genfromtxt を使用して、numpy に値が欠落している csv データをインポートする

欠損値で終わるテキスト ファイルをまだ処理できません。

a.txt:

1 2 3
4 5 6
7 8

のオプションの複数の配置を試しましたがmissing_valuesfilling_valuesこれを機能させることができません:

import numpy as np

sol = np.genfromtxt("a.txt", 
                    dtype=float,
                    invalid_raise=False, 
                    missing_values=None,
                    usemask=True,
                    filling_values=0.0)
print sol

私が取得したいのは次のとおりです。

[[1.0 2.0 3.0]
 [4.0 5.0 6.0]
 [7.0 8.0 0.0]]

しかし、代わりに私は得る:

/usr/local/lib/python2.7/dist-packages/numpy/lib/npyio.py:1641: ConversionWarning: Some errors were detected !
    Line #3 (got 2 columns instead of 3)
  warnings.warn(errmsg, ConversionWarning)
[[1.0 2.0 3.0]
 [4.0 5.0 6.0]]
4

3 に答える 3

8

パンダの使用:

import pandas as pd

df = pd.read_table('data', sep='\s+', header=None)
df.fillna(0, inplace=True)
print(df)
#    0  1  2
# 0  1  2  3
# 1  4  5  6
# 2  7  8  0

pandas.read_tableNaN欠損データをsに置き換えます。NaNを使用して、これらの を他の値に置き換えることができますdf.fillna

dfですpandas.DataFrame。以下を使用して、基になる NumPy 配列にアクセスできますdf.values

print(df.values)
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  0.]]
于 2013-06-25T21:36:11.940 に答える
4

問題は、numpy が不規則な配列を好まないことです。ファイルの最後の行の 3 番目の位置に文字がないため、genfromtxt はそれが解析対象であることさえ知りません。欠損値に次のようなフィラー (任意のフィラー) がある場合:

1 2 3
4 5 6
7 8 ''

次に、次のことができます。

sol = np.genfromtxt("a.txt",
                dtype=float,
                invalid_raise=False,
                missing_values='',
                usemask=False,
                filling_values=0.0)

and: ソル

array([[  1.,   2.,   3.],
       [  4.,   5.,   6.],
       [  7.,   8.,  nan]])

残念ながら、ファイルの列を統一することができない場合は、行ごとの解析に行き詰まる可能性があります。

もう1つの可能性は、すべての「短い」行が最後にある場合です...その場合、「usecols」フラグを使用して均一なすべての列を解析し、次にskip_footerフラグを使用して同じことを行うことができます利用できないものをスキップしながら、残りの列について:

sol = np.genfromtxt("a.txt",
                dtype=float,
                invalid_raise=False,
                usemask=False,
                filling_values=0.0,
                usecols=(0,1))
sol
array([[ 1.,  2.],
   [ 4.,  5.],
   [ 7.,  8.]])

sol2 = np.genfromtxt("a.txt",
                dtype=float,
                invalid_raise=False,
                usemask=False,
                filling_values=0.0,
                usecols=(2,),
                skip_footer=1)
sol2
array([ 3.,  6.])

そして、そこから配列を結合して、塗りつぶし値を追加します。

sol2=np.append(sol2, 0.0)
sol2=sol2.reshape(3,1)
sol=np.hstack([sol,sol2])
sol
array([[ 1.,  2.,  3.],
   [ 4.,  5.,  6.],
   [ 7.,  8.,  0.]])
于 2013-06-25T21:30:22.047 に答える