2012-03-02 6 views
1

헤더의 배열 내용을 인쇄하고 있습니다. 배열은 파이썬이 지수 형식으로 인쇄하는 매우 작은 숫자를 포함합니다. nums row_stack에 csv 작성자와 헤더로 인쇄 할 때 지수가 잘립니다. 헤더없이 인쇄 할 경우 지수가 표시됩니다.파이썬 csv writer가 숫자 형식을 자릅니다.

버전 A :

print t 
[[ 5.16535888e-06 4.38980952e+02] 
[ 1.34684766e-05 3.37237262e+02] 
[ 7.95903202e-06 6.45989985e+02] 
[ 8.35716563e-06 3.66632398e+02] 
[ 9.39419622e-06 7.14825200e+01]] 

버전 B :

# print in table form 
writer = csv.writer(sys.stdout, delimiter="\t")   
writer.writerows([komponents]) 
writer.writerows(np.row_stack((t))) 
>>> 
col1 col2 
5.16535887883e-06 438.980952441 
1.34684765805e-05 337.237261686 
7.95903202041e-06 645.989985081 
8.35716563314e-06 366.632397875 
9.39419621582e-06 71.4825200296 

버전 C :

# print in table form 
writer = csv.writer(sys.stdout, delimiter="\t")  
writer.writerows(np.row_stack((komponents, t))) 
>>> 
col1 col2 
5.165358 438.9809 
1.346847 337.2372 
7.959032 645.9899 
8.357165 366.6323 
9.394196 71.48252 

물론, 버전 C가 올바르지 않습니다.

아이디어가 있으십니까? 감사합니다.

답변

2

문제는 부동 소수점 값의 데이터 형식을 강제하고 있다는 것입니다. numpy.row_stack을 호출하면 데이터 형식이 문자열이됩니다. 예를 들어 :

>>> x = numpy.array([1.34684766e-05, 6.45989985e+02]) 
>>> s = numpy.array(["col1", "col2"]) 
>>> numpy.row_stack((x,s)) 
array([['1.346847', '645.9899'], 
     ['col1', 'col2']], 
     dtype='|S8') 

나는이 일을 numpy.savetxt을 사용하는 것이 좋습니다 것입니다. 예 :

>>> import numpy 
>>> t = numpy.array([[ 5.16535888e-06, 4.38980952e+02], 
... [ 1.34684766e-05, 3.37237262e+02], 
... [ 7.95903202e-06, 6.45989985e+02], 
... [ 8.35716563e-06, 3.66632398e+02], 
... [ 9.39419622e-06, 7.14825200e+01]]) 
>>> komponents = numpy.array([["col1", "col2"]]) 
>>> 
>>> import StringIO 
>>> s = StringIO.StringIO() 
>>> numpy.savetxt(s, komponents, fmt="%s", delimiter="\t") 
>>> numpy.savetxt(s, x, delimiter="\t") 
>>> print s.getvalue() 
col1 col2 
5.165358879999999622e-06 4.389809520000000020e+02 
1.346847660000000055e-05 3.372372619999999870e+02 
7.959032020000000055e-06 6.459899850000000470e+02 
8.357165630000000265e-06 3.666323980000000233e+02 
9.394196219999999191e-06 7.148251999999999384e+01