강
[Python] numpy to list 소수점 값이 다른 현상 해결 본문
문제 인식
python 작업중 numpy로 된 값들을 소수점 4자리까지만 자르고 numpy가 아닌 list로 바꾸었을 때 다음과 같이 의도하지 않은 결과값을 얻었다.
빨간 박스 값 중 위의 값이 numpy이고 아래의 값이 일반적인 python list의 값이다. 보이는 것과 같이 list로 변환했더니 소수점 5자리 이상의 값들이 생김을 확인했다.
이 문제는 python list의 float와 numpy의 float type를 python에서 내부적으로 다르게 취급하여 발생하는 문제였다. 따라서 list로 변환했을 때 추가적으로 소수점값이 붙는 것이였다.
해결 방안
numpy의 dtype을 찍어보니 기본적으로 numpy.float32형임을 확인했다. 하지만 python에서는 현재 numpy.float64버전에서만 원본 값그대로 list형으로 변환할 수 있다고 한다. 따라서 round 처리를 하기 전에 numpy.float64로 변환하는 코드를 추가했다.
기존 코드
# result는 numpy array
result = np.round(result, 4)
# tolist로 python list로 변환
result = result.tolist()
해결한 코드
# astype을 이용하여 np.float32 -> np.float64 변환
result = np.round(result.astype(np.float64),4)
result = result.tolist()
astype으로 numpy.float64 dtype으로 변환하니 numpy의 값 그대로 list로 변환되었다.
참조
- https://stackoverflow.com/questions/61300178/does-the-value-change-if-i-change-a-numpy-array-to-a-list-and-then-change-the-li
- https://stackoverflow.com/questions/13629245/anomalous-decimal-places-in-python-after-list-to-numpy-to-list
- https://stackoverflow.com/questions/65732046/how-to-convert-a-float-numpy-ndarray-to-list
- https://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types
'Python' 카테고리의 다른 글
Slack ChatGPT 연동하기 (19) | 2023.01.28 |
---|---|
[Python] Imagenet grayscale to rgb channel 처리 (1) | 2021.10.26 |
[Python] pip install Killed 해결 (0) | 2021.10.13 |
[python] requirements.txt pip freeze 가상환경으로 정리 (2) | 2021.10.06 |
Comments