这有点复杂,因为名称根据上下文具有不同的含义。
int
- 在Python中
在
int通常仅仅是一个Python类型,它是任意精度的,这意味着你可以存储在它里面的任何可能的整数(只要你有足够的内存)。
>>> int(10**50)100000000000000000000000000000000000000000000000000
- 但是,当将其
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_)
- 作为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)
可能还有更多。
- 在Cython中,但作为Python类型。您仍然可以调用,
int
并获得一个“ Python int”(任意精度),或者将其用作isinstance
或用作的dtype
参数np.array
。这里的上下文很重要,因此转换为Pythonint
与转换为C int是不同的:cdef object val = int(10) # Python int
cdef int val =
(10) # C int
np.int
其实这很容易。这只是一个别名
int:
>>> int is np.intTrue
因此,上述所有内容同样适用
np.int。但是,除非在
cimported软件包上使用它,否则不能将其用作类型标识符。在这种情况下,它表示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_



