2016-12-02 4 views
0

私は1つの列にイメージ(ベクトル化された)を含むcsvファイルを作成しています。ここはthe csv file ~240MBです。配列と文字列の長さが前後に変換するときに一致しません

イメージの文字列を整数のリストに変換し、マトリックスに変形し、フリップしてリストに戻し、最後に長い文字列に変換しようとしています。しかし、物事は私が期待したものにはならなかった。以下は、私のコードは次のとおりです。

import pandas as pd 
import numpy as np 
df = pd.read_csv('training.csv') 
img = df['Image'][0] # take the first row as example 
img_int = np.fromstring(img, sep=' ') # img_int.shape --> (9216,), good. 
img_matrix = img_int.reshape(96,96) 
img_matrix_flipped = np.fliplr(img_matrix) # img_matrix_flipped.shape --> (96,96), good 
img_matrix_flipped_vector = img_matrix_flipped.reshape(1, 9216) # img_matrix_flipped_vector.shape --> (1, 9216), good 
img_matrix_flipped_vector_str = str(img_matrix_flipped_vector) # len(img_matrix_flipped_vector_str) --> 44, NOT GOOD!!! 

私がlen(img_matrix_flipped_vector_str)は、文字列がその中のすべての9216個の整数を含むべきではない44である理由について混乱していますか?親切にお手伝いください!

+0

私の知る限り、あなたのコードに間違いはありません。すべての配列シンボルと改行を取得しないようにするには、配列上で 'tostring()'メソッドを使う方が良いでしょう。 – Dschoni

答えて

1

@ Dschoniの答えに基づいて、私はstr()メソッドを使用すべきではないと考えました。それで私はanother topicを見つけたので、解決策を見つけるのに役立ちました。

img_matrix_flipped_vector = img_matrix_flipped.reshape(9216) 
list = img_matrix_filpped_vector.tolist() 
str_I_want = ' '.join([str(i) for i in list]) 
+0

これを追加するだけで、リストを反復する代わりに、フラット化された配列を直接反復してメモリを節約することができます。そして、あなたがjoinメソッドと呼ぶ文字列に応じて、これはセパレータになります。 – Dschoni

0

私が見つけたのは: 配列のstring()メソッドは、印刷可能な文字列表現を返します。この文字列を印刷すると、番号が表示されます。中央に「...」のように短縮されている可能性があります。 numpy配列を文字列に変換するには、配列のtostring()またはtobytes()メソッドを使用します。 2次元配列ではなく1次元配列にリサーブしたい場合もありますが、目的に応じて1つの軸のサイズが1 (array.reshape(9216)ではarray.reshape(1,9216))です。

+0

こんにちは@Dschoni、あなたが正しいです、 '' 'str()' 'メソッドは、犯人です!しかし、tostring() '' ''や '' tobytes() '' 'は私に欲しいものを私に与えません... – user3768495

+0

' '' \ x000 \ x0000'''は ' '' tostring() '' 'または' '' tobytes() '' 'です。 – user3768495

関連する問題