2017-12-04 23 views
0

(Windows 7, Python 3.4.5, Anaconda 2.2.0 (64 비트), 기본값 : Jul 5 2016, 14:53:07) [MSC v.1600 64 비트 (AMD64)])numpy set_printoptions 정밀도가 튜플 목록에서 무시되었습니다.

내가 깔끔하게 np.set_printoptions (정밀도를 사용하여 일부 데이터를 인쇄하려고했다 = 왜 무시 보인다

import numpy as np 
np.set_printoptions(precision=4) 

a=[[1,15.02], 
[2,14.38], 
[3,14.60]] 

b=np.array(a) 
print(b) 
at=b.T 
l=list(zip(at[0],at[1])) 
print(l) 

출력 :.?

[[ 1. 15.02] 
[ 2. 14.38] 
[ 3. 14.6 ]] 
[(1.0, 15.02), (2.0, 14.380000000000001), (3.0, 14.6)] 
+0

더 이상 np 배열이 아니고 numpy의 인쇄 기법이 사용되지 않았기 때문에? – sascha

+0

이 경우 어떤 인쇄 기법을 적용해야합니까? – Krischu

+0

정확한 유스 케이스에 따라 [this] (https://stackoverflow.com/a/1567630/2320035)와 같은 문자열 형식을 기반으로 나 자신을 정의해야합니다. – sascha

답변

0

부유물 문제 :

In [118]:ref=decimal.Decimal('14.380000000000000000000000000000000000000000000000') 

In [119]: decimal.Decimal(14.38) 
Out[119]: Decimal('14.3800000000000007815970093361102044582366943359375') 

In [120]: decimal.Decimal(14.38)-ref 
Out[120]: Decimal('7.815970093361102044582366943E-16') 

In [121]: decimal.Decimal(14.38-2**-50)-ref 
Out[121]: Decimal('-9.947598300641402602195739746E-16') 

이 수치는 14.380000000000001이 14.38의 최적 float64 근사값임을 보여줍니다.

이 사실을 해결하기 위해, 당신은 np.float32에서 다운 그레이드 할 수 있습니다 : 그러나

In [140]:tuple(zip(*np.array(a).T.astype(np.float32))) 
Out[140]: ((1.0, 15.02), (2.0, 14.38), (3.0, 14.6)) 
0
In [34]: a 
Out[34]: [[1, 15.02], [2, 14.38], [3, 14.6]] 
In [35]: b=np.array(a, dtype=float).T 
In [36]: b 
Out[36]: 
array([[ 1. , 2. , 3. ], 
     [ 15.02, 14.38, 14.6 ]]) 
In [37]: list(zip(*b)) 
Out[37]: [(1.0, 15.02), (2.0, 14.380000000000001), (3.0, 14.6)] 

경우 내가 먼저 지난 btolist 통해 : 첫 번째 경우

In [38]: list(zip(*b.tolist())) 
Out[38]: [(1.0, 15.02), (2.0, 14.38), (3.0, 14.6)] 

의 요소 튜플은 여전히 ​​np.float64 래퍼를 가지고 있으며, tolist은 모든 것을 파이썬 고유 번호로 추출합니다 :

In [39]: type(list(zip(*b))[1][1]) 
Out[39]: numpy.float64 
In [40]: type(list(zip(*b.tolist()))[1][1]) 
Out[40]: float 

item는 고유 번호를 추출하는 또 다른 방법이다 :

In [41]: list(zip(*b))[1][1] 
Out[41]: 14.380000000000001 
In [42]: list(zip(*b))[1][1].item() 
Out[42]: 14.38 

나는 setprintoptionsnp.float64의 경우에는 적용되지 않는 이유를 말할 수는 없지만, np.array로한다.

일반적으로 배열과 모든 값을 기본 Python 목록으로 변환하려면 tolist()을 사용하는 것이 좋습니다. 목록 및 우편 번호와 같은 작업으로는 충분하지 않습니다. 그들은 배열의 첫 번째 차원을 반복하지만, 재귀 적 요소를 변환하지 않습니다

부분 변환 (들) :

In [43]: list(b) 
Out[43]: [array([ 1., 2., 3.]), array([ 15.02, 14.38, 14.6 ])] 
In [44]: list(b[1]) 
Out[44]: [15.02, 14.380000000000001, 14.6] 

전체 변환 : 분명히

In [45]: b.tolist() 
Out[45]: [[1.0, 2.0, 3.0], [15.02, 14.38, 14.6]] 

float64의 포맷터는 set_printoptions 값과 관계없이 모든 정밀도를 표시합니다.

In [58]: 14.380000000000001 
Out[58]: 14.38 
In [59]: np.array(14.380000000000001) 
Out[59]: array(14.38) 
In [60]: np.float64(14.380000000000001) 
Out[60]: 14.380000000000001 
In [61]: np.float32(14.380000000000001) 
Out[61]: 14.38 

np.float64(...) 개체는 여러 가지면에서 단일 항목 배열과 비슷하지만 미묘한 차이가 있습니다. 일반적으로 우리는 그러한 객체를 직접 생성하지는 않습니다.