2013-05-10 3 views
10

numphy 배열의 배열을 문자열 (SQL DB에 저장)로 변환 한 다음 동일한 문자열을 다시 numpy float 배열. 내가 문자열로 갈거야 방법numpy 배열을 CSV 문자열로 변환하고 CSV 문자열을 다시 numpy 배열로 변환합니다.

이입니다()

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

그래서 먼저이, 갈 수있는 좋은 방법 일 것입니다 무엇입니까? 마지막 쉼표를 제거하는 더 나은 방법인가요? 또는 join 메서드를 사용하여 쉼표를 삽입 할 수 있습니까?

둘째, 더 중요한 것은 문자열에서 float 배열로 돌아가는 영리한 방법이 있습니까?

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을 환영합니다. 팬더는 사용자가 num341을 잊어 버릴만큼 강력합니다. – 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

아, 파일 버퍼로 문자열을 설정 ... 갈 길. 거기에 영리한 방법이 있어야한다는 것을 알았습니다. – Matt

+0

이것은 제가 게시 한 링크의 5 번 방법과 매우 유사합니다. 나는 그것을 알아 차렸을 것입니다. 감사. 나는 Boud의 방법을 고수 할 것입니다. – Dan

+0

@ 내 코드의 모든 연산이'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

관련 문제