numpy dtype이 있으면 가장 가까운 python 데이터 유형으로 자동 변환하는 방법은 무엇입니까? 예를 들어
numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32 -> "python int"
numpy.int16 -> "python int"
이 모든 경우의 매핑을 생각해 볼 수는 있지만 numpy는 dtype을 가장 가까운 원시 파이썬 유형으로 자동 변환하는 방법을 제공합니까? 이 매핑은 철저 할 필요는 없지만 가까운 파이썬 아날로그를 가진 일반적인 dtype을 변환해야합니다. 나는 이것이 이미 어딘가에 있다고 생각합니다.
답변
val.item()
대부분의 NumPy 값을 기본 Python 유형으로 변환하는 데 사용하십시오 .
import numpy as np
# for example, numpy.float32 -> python float
val = np.float32(0)
pyval = val.item()
print(type(pyval)) # <class 'float'>
# and similar...
type(np.float64(0).item()) # <class 'float'>
type(np.uint32(0).item()) # <class 'long'>
type(np.int16(0).item()) # <class 'int'>
type(np.cfloat(0).item()) # <class 'complex'>
type(np.datetime64(0, 'D').item()) # <class 'datetime.date'>
type(np.datetime64('2001-01-01 00:00:00').item()) # <class 'datetime.datetime'>
type(np.timedelta64(0, 'D').item()) # <class 'datetime.timedelta'>
...
(또 다른 방법은 np.asscalar(val)
NumPy 1.16부터 더 이상 사용되지 않습니다).
궁금한 점이 있으시면 시스템에 대한 NumPy 배열 스칼라 변환 표 를 작성하십시오.
for name in dir(np):
obj = getattr(np, name)
if hasattr(obj, 'dtype'):
try:
if 'time' in name:
npn = obj(0, 'D')
else:
npn = obj(0)
nat = npn.item()
print('{0} ({1!r}) -> {2}'.format(name, npn.dtype.char, type(nat)))
except:
pass
등 일부 시스템에는 기본 파이썬에 해당이없는 몇 NumPy와 유형이있다 : clongdouble
, clongfloat
, complex192
, complex256
, float128
, longcomplex
, longdouble
와 longfloat
. 사용하기 전에 가장 가까운 NumPy로 변환해야합니다 .item()
.
답변
numpy 유형과 표준 파이썬이 혼합되어 있음을 발견했습니다. 모든 numpy 유형이에서 파생되었으므로 numpy.generic
모든 것을 파이썬 표준 유형으로 변환하는 방법은 다음과 같습니다.
if isinstance(obj, numpy.generic):
return numpy.asscalar(obj)
답변
(numpy.array 또는 numpy 스칼라 OR 기본 유형 또는 numpy.darray) 기본 유형으로 변환하려면 다음을 수행하십시오.
converted_value = getattr(value, "tolist", lambda: value)()
tolist는 스칼라 또는 배열을 파이썬 기본 유형으로 변환합니다. 기본 람다 함수는 값이 이미 고유 한 경우를 처리합니다.
답변
어때요 :
In [51]: dict([(d, type(np.zeros(1,d).tolist()[0])) for d in (np.float32,np.float64,np.uint32, np.int16)])
Out[51]:
{<type 'numpy.int16'>: <type 'int'>,
<type 'numpy.uint32'>: <type 'long'>,
<type 'numpy.float32'>: <type 'float'>,
<type 'numpy.float64'>: <type 'float'>}
답변
tolist()
이를 달성하기위한보다 일반적인 접근 방식입니다. 모든 기본 dtype과 배열 또는 행렬에서도 작동합니다.
기본 유형에서 호출하면 실제로 목록을 생성하지 않습니다.
numpy == 1.15.2
>>> import numpy as np
>>> np_float = np.float64(1.23)
>>> print(type(np_float), np_float)
<class 'numpy.float64'> 1.23
>>> listed_np_float = np_float.tolist()
>>> print(type(listed_np_float), listed_np_float)
<class 'float'> 1.23
>>> np_array = np.array([[1,2,3.], [4,5,6.]])
>>> print(type(np_array), np_array)
<class 'numpy.ndarray'> [[1. 2. 3.]
[4. 5. 6.]]
>>> listed_np_array = np_array.tolist()
>>> print(type(listed_np_array), listed_np_array)
<class 'list'> [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
답변
변환하려는 객체 의 item()
메소드 를 호출 할 수도 있습니다 .
>>> from numpy import float32, uint32
>>> type(float32(0).item())
<type 'float'>
>>> type(uint32(0).item())
<type 'long'>
답변
일반적인 유형 변환 함수를 다음과 같이 작성할 수 있다고 생각합니다.
import numpy as np
def get_type_convert(np_type):
convert_type = type(np.zeros(1,np_type).tolist()[0])
return (np_type, convert_type)
print get_type_convert(np.float32)
>> (<type 'numpy.float32'>, <type 'float'>)
print get_type_convert(np.float64)
>> (<type 'numpy.float64'>, <type 'float'>)
이것은 고정 목록이 없으며 코드가 더 많은 유형으로 확장됨을 의미합니다.