2016-10-05 5 views
1

私はCSVファイルから読み込もうとしているndarrayを持っています。 ファイルからnumpy経由で読むことができますが、必要な構造を取得できません。代わりに、2次元アレイのIタプルPython 3 Numpy File CSVをnarrayに変換する

MCVEとして

の配列を有する:

dataset=numpy.array([ 
     ["abc ",3000.0,1], 
     ["def",3650.0,1], 
     ["xyz",3000.0,2]   
     ]) 
print("DataSet1\n",dataset) 
print("DataSet1-Shape\n",dataset.shape) 


dataset2=numpy.array([]) 

dataset2 = np.genfromtxt('file.csv', delimiter=",",dtype='S32,float,int') 

print("DataSet2\n",dataset2) 
print("DataSet2-Shape\n",dataset2.shape) 

出力である:

DataSet1 
[['abc ' '3000.0' '1'] 
['def' '3650.0' '1'] 
['xyz' '3000.0' '2']] 
DataSet1-Shape 
(3, 3) 
DataSet2 
[(b'"fabc"', 3000.0, 1) (b'"fdef"', 3650.0, 1) (b'"ghi"', 3000.0, 2)] 
DataSet2-Shape 
(3,) 

I代わりDataSet1ような2次元アレイ、IはDataSet2を有しますDataSet2をDataSet1のように2Dにします。

CSVファイルの内容:

"fabc",3000.0,1 
"fdef",3650.0,1 
"ghi",3000.0,2 
+0

あなたのcsvのコンテンツを含めることができますか? –

+0

今のところcsvは3行ですが、伸びるでしょう: "fabc"、3000.0,1 "fdef"、3650.0,1 "ghi"、3000.0,2 – user914584

+0

これを含めるには、 n個の文字も欠落しています) –

答えて

1

np.array([list(tup) for tup in dataset2])でリストにタプルをリスト内包を使用して、鋳造作業をする必要があります:

>>> np.array([list(tup) for tup in dataset2]) 
array([['"fabc"', '3000.0', '1'], 
     ['"fdef"', '3650.0', '1'], 
     ['"ghi"', '3000.0', '2']], 
     dtype='|S6') 
>>> np.array([list(tup) for tup in dataset2]).shape 
(3, 3) 

dataset2が次の行に上書きされますので、あなたの dataset2 = numpy.array([])は無用である気づきます。 編集: [list(tup) for tup in dataset2]は、 map(list, dataset2)の結果です。

np配列の混合型については、Store different datatypes in one NumPy array?を参照してください。代わりにpandas.DataFrameを使用することをお勧めします。

+0

各フィールドの値が文字列になっていることを除いて、ほとんど動作します... [[b '"fabc"' b'3000.0 'b'1'] [b '"fdef"' b'3650.0 'b'1'] [b '"ghi"' b'3000.0 'b'2']] – user914584

+0

numpy配列には1つの型しかないと思います。あなたは混在型(ちょうどdf = pd.DataFrame(your_array)を行う)の場合は、 –

+0

の 'dataset2.tolist()'はあなたのリストの理解と同様に動作しますので、pandas.DataFrameを使用することができます。 'np.array'は、複合dtypeが与えられていない限り、リストのようにタプルを扱います。 – hpaulj

0

あなたの化合物dtypeは、3つのフィールド

In [195]: data=np.genfromtxt('stack39872346.txt',delimiter=',',dtype='S32,float,int') 
In [196]: data 
Out[196]: 
array([(b'"fabc"', 3000.0, 1), (b'"fdef"', 3650.0, 1), 
     (b'"ghi"', 3000.0, 2)], 
     dtype=[('f0', 'S32'), ('f1', '<f8'), ('f2', '<i4')]) 
In [197]: data.shape 
Out[197]: (3,) 
In [198]: data.dtype 
Out[198]: dtype([('f0', 'S32'), ('f1', '<f8'), ('f2', '<i4')]) 

で1次元配列としてファイルをロードあなたの Dataset1文字列DTYPEと2Dです:

In [207]: Dataset1 
Out[207]: 
array([['abc ', '3000.0', '1'], 
     ['def', '3650.0', '1'], 
     ['xyz', '3000.0', '2']], 
     dtype='<U6') 

は、単純なものに複合DTYPEの変換が少ないですトリッキー。これはastypeで行うことができます。しかしおそらく、リストバージョンのdataを仲介者として使用する方が簡単かもしれません。

In [203]: data.tolist() 
Out[203]: [(b'"fabc"', 3000.0, 1), (b'"fdef"', 3650.0, 1), (b'"ghi"', 3000.0, 2)] 
In [204]: np.array(data.tolist()) 
Out[204]: 
array([[b'"fabc"', b'3000.0', b'1'], 
     [b'"fdef"', b'3650.0', b'1'], 
     [b'"ghi"', b'3000.0', b'2']], 
     dtype='|S6') 

np.array

はタプルのリストを読んで、そして最も一般的なタイプ、 S6(PY3のバイト文字列)

今ではastypeでUnicode文字列に変換するのは簡単であるとの2次元配列を作成しました:

In [205]: np.array(data.tolist()).astype("U6") 
Out[205]: 
array([['"fabc"', '3000.0', '1'], 
     ['"fdef"', '3650.0', '1'], 
     ['"ghi"', '3000.0', '2']], 
     dtype='<U6') 

これは、最初の列が二重引用符で囲まれていることを除いて、Dataset1に似ています。

私はdtypeを指定して、最後astypeをスキップすることができます:genfromtxtにそれを伝え、np.array(data.tolist(),dtype=str)

いっそのこと:

np.genfromtxt('stack39872346.txt',delimiter=',',dtype=str) 

元の化合物のDTYPEについての素晴らしい事は、あなたが、数値にアクセスできるということです数字としてのフィールド:

In [214]: data['f1'] 
Out[214]: array([ 3000., 3650., 3000.]) 
In [215]: Dataset1[:,1] 
Out[215]: 
array(['3000.0', '3650.0', '3000.0'], 
     dtype='<U6') 

私は二重引用符を扱っていません。 csvリーダーはそれらを取り除くことができます。 genfromtxtはありません。幸いにも引用符には区切り文字がありませんので、genfromtxtの読み取り中にそれらを取り除くconverterと書くことができます。私はconverterをロードするときに複合DTYPEを使用するために持っているよう

=================は

def foo(astr): 
    return astr[1:-1] # crude dequote 

In [223]: data=np.genfromtxt('stack39872346.txt',delimiter=',', 
    dtype='U6,float,int', converters={0:foo}) 
In [224]: data 
Out[224]: 
array([('fabc', 3000.0, 1), 
     ('fdef', 3650.0, 1), 
     ('ghi', 3000.0, 2)], 
     dtype=[('f0', '<U6'), ('f1', '<f8'), ('f2', '<i4')]) 

In [225]: np.array(data.tolist()) 
Out[225]: 
array([['fabc', '3000.0', '1'], 
     ['fdef', '3650.0', '1'], 
     ['ghi', '3000.0', '2']], 
     dtype='<U6') 

に見えます。

関連する問題