在 Cython 中高效访问 scipy lil_matrix

在 Cython 中高效地访问 scipy 的 lil_matrix(LInked List format)可以通过以下步骤实现:

  1. 导入所需的模块: 首先,导入必要的模块,包括 numpyscipy.sparse 中的 lil_matrix
  2. 定义函数原型: 在 Cython 中,您需要定义函数原型,以便能够调用 lil_matrix 中的方法。
  3. 使用 cimport 导入声明: 使用 cimport 声明导入 numpyscipy.sparse 中的 lil_matrix 类。
  4. 类型声明: 在函数中声明 lil_matrix 对象,以便能够正确地访问其属性和方法。
  5. 访问 lil_matrix 使用 lil_matrix 对象的属性和方法来读取或修改其内容。

在这里插入图片描述

1、问题背景

scipy sparse 矩阵是一种稀疏矩阵,在处理大型数据集时非常有用。Cython 是一种静态类型语言,可以编译成 Python 代码,从而提高性能。然而,在 Cython 中访问 scipy 稀疏矩阵时,可能会遇到一些问题。例如,lil_matrix 表示使用不同长度的列表列表。将此类数据结构有效地传递给 Cython(无需复制)可能很困难。

2、解决方案

一种解决方案是使用 Cython 的 cimport 语句导入 scipy。这将允许您在 Cython 代码中使用 scipy 数据类型。然后,您可以使用 cdef 语句声明变量来存储 scipy 稀疏矩阵。例如,以下代码显示了如何声明一个存储 lil_matrix 的变量:

cimport scipy.sparse as sp

cdef sp.lil_matrix m = sp.lil_matrix((10, 10))

另一种解决方案是使用 Cython 的 def 语句定义一个函数来访问 lil_matrix。例如,以下代码显示了如何定义一个函数来计算 lil_matrix 的和:

def sum_lil_matrix(sp.lil_matrix m):
    cdef int i, j, sum = 0
    for i in range(m.shape[0]):
        for j in range(m.shape[1]):
            sum += m[i, j]
    return sum

最后,您还可以使用 Cython 的 @cython.boundscheck(False) 修饰器来关闭边界检查。这将提高代码的性能,但可能会导致错误,因此仅在您确信代码不会访问数组或列表的边界之外时才使用此修饰器。

以下是一些代码示例,展示了如何在 Cython 中高效访问 scipy lil_matrix:

import numpy as np
cimport numpy as np

from scipy.sparse import lil_matrix

cdef iter_over_lil_matrix(m):
    cdef list sums, data_row
    sums = []
    for data_row in m.data:
        s = 0
        for value in data_row:
            s += value
        sums.append(s)
    return sums

def main():
    a = np.random.random((1e4*1e4))
    a[a>0.1] = 0
    a = a.reshape(1e4,1e4)
    m = lil_matrix(a)

    t0 = time.clock()
    sums = iter_over_lil_matrix(m)
    t1 = time.clock()
    print 'Cython lil_matrix Time', t1-t0

    t0 = time.clock()
    array_sums = a.sum(axis=1)
    t1 = time.clock()
    print 'Numpy ndarray Time', t1-t0

    t0 = time.clock()
    lil_sums = m.sum(axis=1)
    t1 = time.clock()
    print 'lil_matrix Time', t1-t0

    mcsr = m.tocsr()
    t0 = time.clock()
    csr_sums = mcsr.sum(axis=1)
    t1 = time.clock()
    print 'csr_matrix Time', t1-t0

    assert np.allclose(array_sums, sums)
    assert np.allclose(array_sums, np.asarray(lil_sums).flatten())
    assert np.allclose(array_sums, np.asarray(csr_sums).flatten())

Timings in seconds - only about 2 times slower than the super-optimized NumPy :D, much faster than the lil_matrix.sum() method because it converts to csr_matrix() before, as clarified by @hpaulj and confirmed by the results below. Note that the csr_matrix.sum() over the columns is almost one order of magnitude faster than the dense sum.
Cython lil_matrix Time 0.183935034665
Numpy ndarray Time 0.106583238273
lil_matrix Time 2.47158218631
csr_matrix Time 0.0140050888745

Things that will slow down the code:

use of for i in range(len(m.data)): with data_row = m.data[i]
declare buffers like np.ndarray[object, ndim=1] data with data=m.data

Things that did not affect:

boundscheck or wraparound

通过使用这些解决方案,您可以在 Cython 中高效访问 scipy lil_matrix。

在这个示例中,我们首先创建了一个 lil_matrix 对象 A,并设置了一些值。然后,我们访问了矩阵的元素,并将其转换为 CSR 格式(压缩稀疏行格式)以进行更高效的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设备全生命周期管理平台:奏响设备管理的“高效乐章”

设备的全生命周期管理是一个复杂而关键的任务。设备的购买、安装、维护和报废都需要精细的管理和跟踪。然而,传统的设备管理方法往往效率低下、信息不准确,并且容易出现遗漏和错误。为解决这一问题,设备全生命周期管理平台应运而生。 设备全…

【Linux系统编程】基本指令(二)

目录 1、mv指令 2、cat指令 输出重定向 ​编辑 追加重定向 输入重定向 3、more指令 4、less指令 5、head指令 6、tail指令 与时间相关的指令 7、date指令 8、cal指令 9、find指令 10、grep指令 11、zip/unzip指令 1、mv指令 mv文件是用来对文件或目录进行重命名…

《新生向》什么是Python环境?

观前提醒:本文详细介绍了Python环境的结构,介绍了python虚拟环境基础用法,以及python中的环境&依赖管理 0.什么是Python环境 Python环境是指一个特定的设置,其中包含了运行Python代码所需的一系列软件工具和包。这个环境可以…

特斯拉FSD的硬件演进与模型压缩技术解析

引言 随着自动驾驶技术的迅速发展,特斯拉的全自动驾驶(FSD)系统也在不断进化。最近,特斯拉开始采用端到端的模型来优化其FSD算法,这种变革引发了广泛关注。本文将探讨特斯拉FSD在车载计算能力和模型压缩技术方面的最新…

基于EBAZ4205矿板的图像处理:12二值化图像的膨胀与腐蚀

基于EBAZ4205矿板的图像处理:12二值化图像的膨胀与腐蚀 先看效果 注意:我的项目中的膨胀和腐蚀是对二值化图像中的像素值为255的像素进行处理,而我的图像中255为白色,0为黑色,所以是对颜色为白色的像素点进行的膨胀和…

Axure “情形”的使用

这篇笔记的主要内容是如果在Axure中使用“情形”,对应在我们的研发中就是“判断条件”的使用 Axure情形的使用Axure添加caseAxure的if ,sele if 条件判断 条件判断不管是在研发代码中还是实际生活中,无处不在,只是表现形式不同罢…

Python专题:十五、JSON数据格式

Python的数据处理:JOSN 计算机的主要工作:处理数据 最容易处理的数据就是结构化数据 非结构化数据:视频,文件等 近些年的大数据、数据挖掘就是对互联网中的各种非结构化的数据的分析和处理 半结构化数据 明确的结构属性&…

查询中Split函数不管用?试试这个自定义函数!

hi,大家好! 我们在实际的应用中会有这样的一些情况,获取的一些数据是由一些特殊字符连接起来的,比如:XXX汽车\SUV\EV\纯电。类似这样的数据,我们在应用过程中,需要将数据拆开,如果用…

16-僵尸进程和托孤进程

进程的正常退出步骤: 子进程调用exit()函数退出父进程调用wait()函数为子进程处理其他事情 若进程没有按正常退出步骤,则有可能变为僵尸进程或者托孤进程 僵尸进程 子进程退出后,父进程没有调用wait()函数处理身后事,子进程变…

Web3 ETF软件开发技术

Web3 ETF(交易所交易基金)是一种基于区块链技术的ETF,它旨在跟踪Web3资产(例如加密货币、NFT等)的价值表现。Web3 ETF的开发涉及到传统ETF开发的所有技术难点,此外还有一些独特的挑战。北京木奇移动技术有限…

短剧私域-快速引流变现

短剧的爆火,衍生出了很多周边项目。 比如免费看剧App,短剧搜索机器人,短剧付费圈子等等。 这些项目的本质,就是借助短剧的热度,把流量引到自己的鱼塘进行变现。 短剧机器人大家都知道,目前最火的一种玩法…

【计算机网络】HTTP协议详解实战抓包分析教程

文章目录 1.HTTP简介2.HTTP报文的结构3.HTTP协议中空行的作用4.uri和url的区别5.HTTP请求5.1 HTTP请求方法5.2 HTTP请求报头 6.HTTP响应6.1 状态码 7.HTTP位于应用层(基于TCP)8.非持久和持久连接8.1 非持久连接8.2 持久连接 1.HTTP简介 HTTP(Hypertext Transfer Pr…

高效前端工程化:Monorepo、pnpm与Vue3集成实战指南

引言 在当今快速发展的前端开发领域,高效地管理和组织代码库成为提升开发效率的关键。随着项目规模的扩大,传统的单体仓库逐渐显露出局限性,而新兴的包管理工具如 PNPM、项目结构模式如 Monorepo 和 Turborepo 开始受到广泛关注。将教会大家…

批量下载huggingface的仓库全部权重文件

下载huggingface的仓库全部权重文件 配置和下载git-lfs **ubuntu:**sudo apt-get install git-lfs 其他: 下载git-lfs Releases git-lfs/git-lfs (github.com) 配置: export PATH$PATH://home/software/lfs/git-lfs-3.5.1/ # 其中目录为你文件夹的目…

功能安全如何在公司顺利开展?-亚远景科技

亚远景功能安全主题线上会议报名开启! 随着汽车技术的不断发展,汽车系统的复杂性和交互性大幅增加,功能安全成为确保驾驶员、乘客及行人安全的关键。 本场功能安全线上会议,亚远景为汽车行业的相关人员准备了以下内容&#xff1a…

多维 HighChart

showHighChart.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- js脚本都是官方的,后两个是highchart脚本 --><script type"text/javascript" src"jquery1.7.1.min.js"&g…

中成科信票务管理系统 SeatMapHandler.ashx SQL注入漏洞复现

0x01 产品简介 中成科信票务管理系统是专注于演出剧院、体育场馆、旅游景区、游乐园、场地活动的票务管理系统,并为特殊客户量身定制票务应用解决方案,可根据用户的要求采用不同的技术载体实现门票的防伪:二维条码门票防伪技术、RFID电子门票防伪技术、手机二维码门票技术、…

09.Hadoop的安装

Hadoop的安装 1.拖拽安装包上传到/opt/software 2.解压文件到/opt/module [itwisenode2 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/3查看文件 drwxr-xr-x. 2 itwise itwise 4096 9月 12 2019 bin drwxr-xr-x. 3 itwise itwise 4096 9月 12 2019 etc …

基于jsp+servlet的网上商城

网上商城系统&#xff08;jspservlethtmlcssjsbootstrap&#xff09; 一、运行项目 在项目的doc文件夹下&#xff0c;有文档&#xff0c;教您怎么启动项目。 二、运行截图 a.项目前端页面 b.后台登录界面 c.后台展示界面 三、用户名和密码 前台的用户名是&#xff1a;mor…

07. 【Java教程】Java 集成开发环境 - IntelliJ IDEA

本小节我们将介绍如何在我们的电脑上安装并配置开发工具&#xff1a;IntelliJ IDEA 1. IDE 概述 1.1 IDE 是什么&#xff1f; IDE 即 Integrated Development Environment 的缩写&#xff0c;中文意为集成开发环境&#xff0c;是用于提供程序开发环境的应用程序&#xff0c;一…