栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

cython中的np.int,np.int_,int和np.int_t之间的区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

cython中的np.int,np.int_,int和np.int_t之间的区别?

这有点复杂,因为名称根据上下文具有不同的含义。

int

  1. 在Python中

int
通常仅仅是一个Python类型,它是任意精度的,这意味着你可以存储在它里面的任何可能的整数(只要你有足够的内存)。

    >>> int(10**50)100000000000000000000000000000000000000000000000000
  1. 但是,当将其
    dtype
    用于NumPy数组时,它将被解释为
    np.int_
    1。这 不是 任意精度,它将具有与C相同的大小
    long
    >>> np.array(10**50, dtype=int)

    OverflowError: Python int too large to convert to C long

这也意味着以下两个是等效的:

    np.array([1,2,3], dtype=int)np.array([1,2,3], dtype=np.int_)
  1. 作为Cython类型标识符,它还有另一个含义,在这里代表ctype
    int
    。它的精度有限(通常为32位)。您可以将其用作Cython类型,例如在定义变量时
    cdef
    cdef int value = 100    # variable

    cdef int[:] arr = … # memoryview

作为

cdef
cpdef
函数的返回值或参数值:

    cdef int my_function(int argument1, int argument2):    # ...

作为“通用”

ndarray

    cimport numpy as cnpcdef cnp.ndarray[int, ndim=1] val = ...

对于类型转换:

    avalue = <int>(another_value)

可能还有更多。

  1. 在Cython中,但作为Python类型。您仍然可以调用,
    int
    并获得一个“ Python int”(任意精度),或者将其用作
    isinstance
    或用作的
    dtype
    参数
    np.array
    。这里的上下文很重要,因此转换为Python
    int
    与转换为C int是不同的:
    cdef object val = int(10)  # Python int

    cdef int val = (10) # C int

np.int

其实这很容易。这只是一个别名

int

>>> int is np.intTrue

因此,上述所有内容同样适用

np.int
。但是,除非在
cimport
ed软件包上使用它,否则不能将其用作类型标识符。在这种情况下,它表示Python整数类型。

cimport numpy as cnpcpdef func(cnp.int obj):    return obj

这将

obj
是一个Python整数, 而不是NumPy类型

>>> func(np.int_(10))TypeError: Argument 'obj' has incorrect type (expected int, got numpy.int32)>>> func(10)10

我的建议

np.int
:尽可能避免使用。在Python代码中,它等同于Python
int
;在Cython代码中,它也等同于Python,
int
但是如果用作类型标识符,它可能会使您和所有阅读代码的人感到困惑!这肯定让我感到困惑。

np.int_

实际上,它只有一个含义:这是一个表示标量NumPy类型的 Python 类型。您可以像Pythons一样使用它

int

>>> np.int_(10)        # looks like a normal Python integer10>>> type(np.int_(10))  # but isn't (output may vary depending on your system!)numpy.int32

或者您使用它来指定

dtype
,例如
np.array

>>> np.array([1,2,3], dtype=np.int_)array([1, 2, 3])

但是您不能将其用作Cython中的类型标识符。

cnp.int_t

这是的类型标识符版本

np.int_
。这意味着您不能将其用作dtype参数。但是您可以将其用作
cdef
声明的类型:

cimport numpy as cnpimport numpy as npcdef cnp.int_t[:] arr = np.array([1,2,3], dtype=np.int_)     |---TYPE---|   |---DTYPE---|

该示例(希望如此)表明,带有尾部的类型标识符

_t
实际上使用不带尾部的 dtype 表示数组的类型
t
。您无法在Cython代码中互换它们!

笔记

NumPy中还有更多数字类型,我将包括一个列表,其中包含NumPy
dtype和Cython类型标识符以及也可以在Cython中使用的C类型标识符。但这基本上来自NumPy文档和Cython
NumPy

pxd
文件:

NumPy dtype          Numpy Cython type         C Cython type identifiernp.bool_  NoneNonenp.int_   cnp.int_t      longnp.intc   Noneint       np.intp   cnp.intp_t     ssize_tnp.int8   cnp.int8_t     signed charnp.int16  cnp.int16_t    signed shortnp.int32  cnp.int32_t    signed intnp.int64  cnp.int64_t    signed long longnp.uint8  cnp.uint8_t    unsigned charnp.uint16 cnp.uint16_t   unsigned shortnp.uint32 cnp.uint32_t   unsigned intnp.uint64 cnp.uint64_t   unsigned longnp.float_ cnp.float64_t  doublenp.float32cnp.float32_t  floatnp.float64cnp.float64_t  doublenp.complex_          cnp.complex128_t          double complexnp.complex64         cnp.complex64_tfloat complexnp.complex128        cnp.complex128_t          double complex

实际上,有Cython类型

np.bool_
cnp.npy_bool
bint
但目前它们都不能用于NumPy数组。对于标量,
cnp.npy_bool
将只是一个无符号整数,而
bint
将是一个布尔值。不知道发生了什么…


1来自NumPy文档“数据类型对象”

内置Python类型

当用于生成dtype对象时,几种python类型等效于对应的数组标量:

intnp.int_bool          np.bool_float         np.float_complex       np.cfloatbytes         np.bytes_strnp.bytes_ (Python2) or np.unipre_ (Python3)unipre       np.unipre_buffer        np.void(all others)  np.object_


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号