将 numpy dtypes 转换为原生 python 类型

新手上路,请多包涵

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

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

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

原文由 conradlee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 463
2 个回答

使用 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 'int'>
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

There are a few NumPy types that have no native Python equivalent on some systems, including: clongdouble , clongfloat , complex192 , complex256 , float128 , longcomplex , longdoublelongfloat .在使用 .item() 之前,需要将它们转换为最接近的 NumPy 等价物。

原文由 Mike T 发布,翻译遵循 CC BY-SA 4.0 许可协议

发现自己混合了一组 numpy 类型和标准 python。由于所有 numpy 类型都派生自 numpy.generic ,以下是将所有内容转换为 python 标准类型的方法:

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

原文由 tm_lv 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏