2016-04-07 8 views
1

私はnumpy.genfromtxt produces array of what looks like tuples, not a 2D array—why?からnumpy.genfromtxt構造化 ndarrayを返すことを知ります。データが同質でない場合は、 異種データを2D配列としてロードするにはどうすればよいですか?例えば異種データ(np.genfromtxt)を2D配列としてロードするにはどうすればよいですか?

、その内容はテキストファイル(ヘッダ以外のすべての項目がintである)

# c1 c2 c3 c4 c5 
3 4 8 6 8 
10 7 6 7 10 
5 10 2 1 3 
7 6 5 3 6 
5 8 5 2 7 
1 2 2 10 8 
10 5 9 3 8 
5 2 4 4 2 

ロードデータnp.genfromtxtを使用して、

# load data from a text file 
table = np.genfromtxt('table.dat', dtype=int, delimiter='\t', names=True, filling_values=0) 
print(table.shape) 
print(table) 

# output 
(8,) 
[(3, 4, 8, 6, 8) (10, 7, 6, 7, 10) (5, 10, 2, 1, 3) (7, 6, 5, 3, 6) 
(5, 8, 5, 2, 7) (1, 2, 2, 10, 8) (10, 5, 9, 3, 8) (5, 2, 4, 4, 2)] 

# expecting result 
(8, 5) 
[[ 7 2 4 9 2] 
[ 5 8 1 6 4] 
[ 6 3 1 4 10] 
[10 10 6 5 5] 
[10 4 7 7 1] 
[ 1 9 8 6 2] 
[ 3 2 3 4 4] 
[ 7 5 9 10 6]] 

PS:私のためにheader = table.dtype.namesを維持したいです他の目的。

+0

予想される結果のデータが入力と似ていない特定の理由はありますか? – user2357112

答えて

1

この場合、pandasを使用し、次にpandasデータフレームをnumpy行列に変換する方が簡単です。

import pandas as pd 
foo = pd.read_csv('table.dat', sep='\t') 
type(foo) 
<class 'pandas.core.frame.DataFrame'> 
bar = foo.as_matrix() 
array([[10, 7, 6, 7, 10], 
     [ 5, 10, 2, 1, 3], 
     [ 7, 6, 5, 3, 6], 
     [ 5, 8, 5, 2, 7], 
     [ 1, 2, 2, 10, 8], 
     [10, 5, 9, 3, 8], 
     [ 5, 2, 4, 4, 2]]) 
bar.shape 
(7,5) 
+0

table.datファイルの最初の行をコピーしていません – Hun

+0

'table = table.view(int、len(table.dtype.names))'はどうですか? – SparkAndShine

+0

まだタプルの問題があると思います。 view()は単なるビューです。それは何も変わらない。 – Hun

1

私はで動作するように、この得た:それが動作する理由はここにあります

import numpy as np 

table = np.genfromtxt('table.dat', 
         dtype=None, 
         skip_header=1) 

を:

  • あなたはスニペットますしない限り、区切り文字(デフォルト)ではないタブ(のように連続した空白文字をすべき投稿されたフォーマットが失われました)。
  • デフォルトfloatではなく、NumPyにdtypeを推測させる必要があります。
  • 質問で希望する出力を得るには、構造体dtypeを作成する関数を取得するのではなく、単にヘッダー列をスキップします。

詳細については、ドキュメント:http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.genfromtxt.htmlをご覧ください。

本質的にcsvファイルを読み込んでいる場合、Pandas DataFrameがより適切かもしれないことに同意します。

+0

Thxしかし、最初の行が見つからないため、 'header = table.dtype.names'(私は他の目的のために使います) – SparkAndShine

1

あなたのデータは均質に見えます - ヘッダーを除くすべてのint。しかし、header=Trueと言うと、構造化配列としてロードするように強制します。 dtypeを見てください。

skip_header=1(構文を確認してください)。 namesを省略します(またはfalseにします)。

つまり、ヘッダー行を無視して、整数をロードする必要があります。

タブ区切り文字が正常に機能しているようです。

view構造化された配列を変換する方法を発見しました。これにより、ヘッダー名と2次元表示の両方が得られます。

関連する問題