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

2024-01-27

面对这么多我有点挣扎intcython 中的数据类型。

np.int, np.int_, np.int_t, int

I guess int在纯Python中相当于np.int_,那么哪里np.int来自?我无法从 numpy 中找到该文档?还有,为什么np.int_存在,因为我们已经有了int?

在 cython 中,我猜int用作 C 类型时cdef int or ndarray[int],并且当用作int()它仍然是蟒蛇施法者吗?

Is np.int_相当于long在C语言中?所以cdef longcdef np.int_?

什么情况下我应该使用np.int_t代替np.int? e.g. cdef np.int_t, ndarray[np.int_t] ...

有人可以简要解释一下这些类型的错误使用将如何影响编译后的 cython 代码的性能吗?


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

int

  1. 在Python中

    The int通常只是一个 Python 类型,它具有任意精度,这意味着您可以在其中存储任何可以想象的整数(只要您有足够的内存)。

    >>> int(10**50)
    100000000000000000000000000000000000000000000000000
    
  2. 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_)
    
  3. 作为 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)
    

    可能还有更多。

  4. 在 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以及。但是,您不能将其用作类型标识符,除非您在cimported 包。在这种情况下,它代表 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-typesCython 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_
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cython 中 np.int、np.int_、int 和 np.int_t 之间的区别? 的相关文章

  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐