将numpy数据类型转换为本机python类型

2024-05-29 05:45:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个numpy数据类型,如何自动将其转换为最接近的python数据类型?例如

numpy.float32 -> "python float"
numpy.float64 -> "python float"
numpy.uint32  -> "python int"
numpy.int16   -> "python int"

我可以尝试找出所有这些情况的映射,但是numpy是否提供了一些自动的方法来将其数据类型转换为最接近的本地python类型?此映射不必详尽无遗,但它应该转换具有接近python模拟的公共数据类型。我想这已经发生在纽比的某个地方了。


Tags: 数据方法numpy类型地方情况floatint
3条回答

如果要将(numpy.array或numpy scalar或native type或numpy.darray)转换为native type,只需执行以下操作:

converted_value = getattr(value, "tolist", lambda: value)()

tolist将把标量或数组转换为python原生类型。默认lambda函数处理值已经是本机值的情况。

发现自己混合了一组numpy类型和标准python。由于所有numpy类型都是从numpy.generic派生的,下面介绍如何将所有类型转换为python标准类型:

if isinstance(obj, numpy.generic):
    return numpy.asscalar(obj)

使用^{}将大多数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'>
...

(另一个方法是^{},但是自从NumPy 1.16以来,它就被弃用了)。


对于好奇者,要为您的系统构建一个NumPy array scalars转换表:

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类型在某些系统上没有本地Python等价物,包括:clongdoubleclongfloatcomplex192complex256float128longcomplexlongdoublelongfloat。在使用.item()之前,需要将它们转换为最接近的NumPy等价物。

相关问题 更多 >

    热门问题