这有点复杂,因为根据上下文,名称有不同的含义。
int
-
在Python中
The int
通常只是一个 Python 类型,它具有任意精度,这意味着您可以在其中存储任何可以想象的整数(只要您有足够的内存)。
>>> int(10**50)
100000000000000000000000000000000000000000000000000
-
However, when you use it as dtype
for a NumPy array it will be interpreted as np.int_
1. Which is not of arbitrary precision, it will have the same size as C's 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 类型标识符,它有另一个含义,这里它代表c /questions/tagged/c type int
。它的精度有限(通常为 32 位)。您可以将其用作 Cython 类型,例如使用以下命令定义变量时cdef
:
cdef int value = 100 # variable
cdef int[:] arr = ... # memoryview
作为返回值或参数值cdef
or cpdef
功能:
cdef int my_function(int argument1, int argument2):
# ...
作为“通用”ndarray
:
cimport numpy as cnp
cdef cnp.ndarray[int, ndim=1] val = ...
对于类型转换:
avalue = <int>(another_value)
可能还有更多。
-
在 Cython 中,但作为 Python 类型。您仍然可以致电int
你会得到一个“Python int”(任意精度),或者将其用于isinstance
or as dtype
论证np.array
。这里上下文很重要,所以转换为Pythonint
与转换为 C int 不同:
cdef object val = int(10) # Python int
cdef int val = <int>(10) # C int
np.int
其实这很容易。这只是一个别名int
:
>>> int is np.int
True
所以上面的所有内容都适用于np.int
以及。但是,您不能将其用作类型标识符,除非您在cimport
ed 包。在这种情况下,它代表 Python 整数类型。
cimport numpy as cnp
cpdef 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代码中它相当于int
在 Cython 代码中,它也相当于 Pythonint
但如果用作类型标识符,它可能会让您和每个阅读代码的人感到困惑!这确实让我很困惑......
np.int_
其实它只有一个意思:Python类型表示标量 NumPy 类型。你像Python一样使用它int
:
>>> np.int_(10) # looks like a normal Python integer
10
>>> 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 cnp
import numpy as np
cdef cnp.int_t[:] arr = np.array([1,2,3], dtype=np.int_)
|---TYPE---| |---DTYPE---|
这个例子(希望)显示了带有尾随的类型标识符_t
实际上使用以下方式表示数组的类型dtype没有尾随t
。您无法在 Cython 代码中互换它们!
Notes
NumPy 中还有其他几种数字类型,我将包含一个列表,其中包含 NumPy dtype 和 Cython 类型标识符以及也可以在 Cython 中使用的 C 类型标识符。但它基本上取自NumPy 文档 https://docs.scipy.org/doc/numpy/user/basics.types.html#array-types-and-conversions-between-types和Cython NumPypxd file https://github.com/cython/cython/blob/master/Cython/Includes/numpy/__init__.pxd:
NumPy dtype Numpy Cython type C Cython type identifier
np.bool_ None None
np.int_ cnp.int_t long
np.intc None int
np.intp cnp.intp_t ssize_t
np.int8 cnp.int8_t signed char
np.int16 cnp.int16_t signed short
np.int32 cnp.int32_t signed int
np.int64 cnp.int64_t signed long long
np.uint8 cnp.uint8_t unsigned char
np.uint16 cnp.uint16_t unsigned short
np.uint32 cnp.uint32_t unsigned int
np.uint64 cnp.uint64_t unsigned long
np.float_ cnp.float64_t double
np.float32 cnp.float32_t float
np.float64 cnp.float64_t double
np.complex_ cnp.complex128_t double complex
np.complex64 cnp.complex64_t float complex
np.complex128 cnp.complex128_t double complex
实际上有 Cython 类型np.bool_
: cnp.npy_bool
and bint
但目前它们都不能用于 NumPy 数组。对于标量cnp.npy_bool
将只是一个无符号整数,而bint
将是一个布尔值。不知道那里发生了什么......
1 Taken From the NumPy documentation "Data type objects" https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.dtypes.html#specifying-and-constructing-data-types
内置 Python 类型
当用于生成 dtype 对象时,几种 python 类型相当于相应的数组标量:
int np.int_
bool np.bool_
float np.float_
complex np.cfloat
bytes np.bytes_
str np.bytes_ (Python2) or np.unicode_ (Python3)
unicode np.unicode_
buffer np.void
(all others) np.object_