2016-05-30 15 views
2

こんにちは、私は彼らがMNISTデータベースを使用するチュートリアルに従っています。今すぐcPickleを使用してデータを解凍し、リストのタプルなどを取得します。私は自分のデータを使いたいですが、私はCSV形式でそれを持っていますし、MNIST形式に変換する方法がわかりません。私は私のトレーニングデータのための48個の単位を使用し、最後の一つは、私はcsvファイル持っているかのリストのリストPython

例私の望ましい結果である:

training_data, validation_data, test_data = cPickle.load(f) 
:私は、彼らがこれを使用して、次のチュートリアルで

1,2,3..........48,1 

そして、もし私

印刷training_data

私はこれを取得:

(array([[ 0., 0., 0., ..., 0., 0., 0.], 
     [ 0., 0., 0., ..., 0., 0., 0.], 
     [ 0., 0., 0., ..., 0., 0., 0.], 
     ..., 
     [ 0., 0., 0., ..., 0., 0., 0.], 
     [ 0., 0., 0., ..., 0., 0., 0.], 
     [ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32), array([5, 0, 4, ..., 8, 4, 8])) 

印刷training_data [0]

[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 

印刷training_data [0] [0]の各セットの値のnumpy.array()、及びtraining_data [1] [0]でありますfloat32にはすべてのセットの出力が表示されます。

そして、私がやっているコードは、このようなものですが、配列について混乱イム()とDTYPE =のfloat32(最初は)あなたができるデータ構造を理解するためのプロンプト

def load(filename): 
    finalDataset = [] 
    res = 0 
    with open(filename, 'rb') as csvfile: 
     lines = csv.reader(csvfile) 
     datos = list(lines) 
     for i in datos: 
      tempA = np.array(i[:len(datos)-2]).astype(np.float64) 
      tempB = np.float64(i[len(datos)-1:]) 
      finalDataset.append((tempA,tempB)) 
    return finalDataset 

答えて

2

に示す無視array()とdtypeの情報基本的には、2つの部分タプルが必要です(LEFTとRIGHTと呼ぶことができます)。 LEFTはリストの(長方形の)リスト(すなわち2次元配列)であり、RIGHTはリスト(すなわち1次元配列)である。

csvの各行について、最初のn-1エントリをLEFTの新しい行として追加し、最後のエントリをRIGHTに追加します。

load関数に関して: あなたのコードは、各行を別々の1dim配列+値として作成し、それらをタプルとして(python)リストに追加します。これはあなたが望むものではありません。上記のように、データを保持する2dim配列と、期待される結果を保持する1dim配列が必要です。

行ごとにnumpy配列を拡張するのはややこしいので、ほとんどの場合は避ける必要があります。次に、データをリストの(python)リストとして構築し、一括変換をnumpy配列に変換するか、あらかじめサイズが設定されたnumpy配列を作成してデータで埋めていくかを選択できます。

def load(filename): 
    # read file into a list of rows 
    with open(filename, 'r') as csvfile: 
     lines = csv.reader(csvfile, delimiter=';') 
     rows = list(lines) 

    # create empty numpy arrays of the required size 
    data = np.empty((len(rows), len(rows[0])-1), dtype=np.float64) 
    expected = np.empty((len(rows),), dtype=np.int64) 

    # fill array with data from the csv-rows 
    for i, row in enumerate(rows): 
     data[i,:] = row[:-1] 
     expected[i] = row[-1] 

    training_data = data, expected 
    return training_data 

EDIT: 注通常のPythonのリストと、特にnumpyの配列の両方の本当にきちんとしたインデックス機能を

以降のコンセプト私が以下で使用しています。負のインデックスはリストの末尾から数えます。-1は最後のエントリ-2、2番目は最後まで続きます。 a:bはスライス、すなわちインデックスa、a + 1、... b-1を有するエントリをインデックスする。その表記でaが空白のままである場合、それは「最初から」を意味し、bが省略されている場合は、「最後の」エントリを意味します。従って:は「すべて」を意味します。通常のPythonリストではこの構文を一次元でサポートしていますが、numpy配列は各次元のインデックスをコロンで区切って、これをマルチディメンションに拡張しています。

EDIT2:空のnumpy配列のサイズはわずかにオフです。

EDIT3:あなたのコメントへの返信

type(training_data) = <type 'tuple'>training_dataは(2つの要素を持つ)のタプルであることを意味しています。

type(training_data[0]) = <type 'numpy.ndarray'>は、numpy配列であることを意味しています(これはリストと同等であると考えています)。

type(training_data[1]) = <type 'numpy.ndarray'>は、training_data[1]もnumpyの配列/リストであることを意味します。

type(training_data[0][0]) = <type 'numpy.ndarray'>は、training_data[0]の各要素自体が配列/リストであることを示しています。

type(training_data[1][0]) = <type 'numpy.int64'>は、training_data[1]の各要素が単一の値であることを示しています。

あなたが期待される結果、つまり、これは単一の値である( training_data[1]内の対応するエントリがある(=これはあなたの入力データ、つまり、値のリストである) training_data[0]の各エントリのためにそれを見ることができます len(training_data[0])

len(training_data[1])値)。

+0

私は正しい考えをするかどうかはわかりませんが、私は2つのリストを一緒に必要とし、データと期待しています。私は例を示します: 最初の行の内容すべて、データと結果、私はタプルで配列が必要です、そして、タプルは配列リストと浮動小数点数を持っています。それが私の考えです。この場合、私はデータと応答を分割し、各行の応答が側面にある必要があります – Ellebkey

+0

そして、私はそれがとてもうまく理解できないので、私が望む構造がどういうものなのか正確には分かりません。 type(training_data)= 、type(training_data [0])= 、type(training_data [1])の各要素のタイプの結果です。 (training_data [1] [0])= と入力します。 – Ellebkey

+0

csvからtraining_dataの構造に変換したいのですか? – PeterE