2013-05-10 31 views
10

浮動小数点数の配列を文字列(SQL DBに格納する)に変換してから、同じ文字列をnumpyフロート配列。これは私が文字列に行くよ方法ですnumpy配列をCSV文字列に変換し、CSV文字列をnumpy配列に戻す

()

VIstring = ''.join(['%.5f,' % num for num in VI]) 
VIstring= VIstring[:-1] #Get rid of the last comma 

ので、まずこれが作業を行い、それが行くには良い方法ですか?その最後のカンマを取り除くより良い方法はありますか?または、私のためにコンマを挿入する方法をjoinできますか?

さらに重要なのは、文字列から浮動小数点配列に戻す巧妙な方法があるかどうかです。ああ

VI 
array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 
     16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 
     14.64359494, 14.25624062, 13.87465893, 13.49884988, 
     13.12881346, 12.76454968, 12.40605854, 12.00293814, 
     11.96379322, 11.96272486, 11.96142533, 11.96010489, 
     11.95881595, 12.26924591, 12.67548634, 13.08158864, 
     13.4877041 , 13.87701221, 14.40238245, 14.94943786, 
     15.49364166, 16.03681428, 16.5498035 , 16.78362298, 
     16.90331119, 17.02299387, 17.12193689, 17.09448654, 
     17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) 

VIstring 
'17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368' 

%.5fから精度の損失は全く問題あり、これらの値は、元の点で補間されている唯一の4小数点以下の精度を持っている:ここでは

は、配列や文字列の例です私はそれを打つ必要はありません。に続いて

VIstring = ','.join(['%.5f' % num for num in VI]) 

:numpyの配列を回復するときに、私は5小数点以下の精度(明らかに私が思う)

+1

numpy savetxt関数とloadtxt関数をチェックアウトすることがあります – Matt

+0

@MattAnderson文字を文字列に直接挿入し、ファイルを使用するのではなくメモリの文字列からまっすぐに読み込む方法はありますか? – Dan

答えて

20

まずあなたが最後のコンマの問題を回避するためにjoinこの方法を使用する必要がありますを取得して幸せそれを読み戻し、numpy.fromstring使用:あなたは全く(必ずしもCSV)いくつかの文字列表現をしたい場合は

np.fromstring(VIstring, sep=',') 
+0

パーフェクト、ありがとう! – Dan

+0

非常に良い機能の提案@Boud。 – Pramit

+0

あなたは大歓迎です@Pramit:パンダは、ユーザーが – Boud

6
>>> import numpy as np 
>>> from cStringIO import StringIO 
>>> VI = np.array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 
     16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 
     14.64359494, 14.25624062, 13.87465893, 13.49884988, 
     13.12881346, 12.76454968, 12.40605854, 12.00293814, 
     11.96379322, 11.96272486, 11.96142533, 11.96010489, 
     11.95881595, 12.26924591, 12.67548634, 13.08158864, 
     13.4877041 , 13.87701221, 14.40238245, 14.94943786, 
     15.49364166, 16.03681428, 16.5498035 , 16.78362298, 
     16.90331119, 17.02299387, 17.12193689, 17.09448654, 
     17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) 
>>> s = StringIO() 
>>> np.savetxt(s, VI, fmt='%.5f', newline=",") 
>>> s.getvalue() 
'17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368,' 
>>> np.fromstring(s.getvalue(), sep=',') 
array([ 17.95024, 17.51671, 17.08895, 16.66696, 16.25074, 15.84029, 
     15.43562, 15.03672, 14.64359, 14.25624, 13.87466, 13.49885, 
     13.12881, 12.76455, 12.40606, 12.00294, 11.96379, 11.96272, 
     11.96143, 11.9601 , 11.95882, 12.26925, 12.67549, 13.08159, 
     13.4877 , 13.87701, 14.40238, 14.94944, 15.49364, 16.03681, 
     16.5498 , 16.78362, 16.90331, 17.02299, 17.12194, 17.09449, 
     17.00066, 16.93006, 16.9723 , 17.21697, 17.75368]) 
+0

ああの下にnumpyの機能を忘れさせるほど強力です、ファイルバッファとして文字列を設定...行く方法。そこにいくつかの巧妙な方法があるはずであることがわかった – Matt

+0

これは私が投稿したリンクから方法5にかなり似ています、私はそれに気づいたはずです。ありがとう。私はおそらくBoudのメソッドに固執するつもりだ – Dan

+0

@Danは私のコード内のすべての操作が 'C'レベルで実行されるので、本当に速くない可能性があります。また、' numpy'関数を使ってホイールの再作成を避けます。 – jamylak

4

、あなたは、これを試みることができる私が使用してきている:

import numpy, json 

## arr is some numpy.ndarray 
s = json.dumps(arr.tolist()) 
arrback = numpy.array(json.loads(s)) 

これはほとんどの一般的なデータ型で機能します。

+1

+1これは非常にクールです。特に精度を保つ必要がある場合は特にそうです。 – Dan

関連する問題