Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Cython 中高效访问 scipy lil_matrix

在 Cython 中高效访问 scipy lil_matrix

原创
作者头像
华科云商小徐
发布于 2024-05-15 01:12:41
发布于 2024-05-15 01:12:41
14900
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

在 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 的变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cimport scipy.sparse as sp
​
cdef sp.lil_matrix m = sp.lil_matrix((10, 10))

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 格式(压缩稀疏行格式)以进行更高效的操作。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
scipy.sparse.csr_matrix
class scipy.sparse.csr_matrix(arg1, shape=None, dtype=None, copy=False)[source]
狼啸风云
2019/10/22
1.5K0
SciPy 稀疏矩阵(5):CSR
上回说到 LIL 格式的稀疏矩阵的 rows 属性和 data 属性是一个其元素是动态数组的数组。其在内存中的存储方式为一个外围定长数组的元素是指向对应动态数组的基地址的指针。这一回,我们需要把这样的指针给消去。然而,仅仅是为什么要消去就是一个很复杂的问题,复杂到完全不能直接回答。因此,首先我需要针对 CPU 访问内存数据的过程外加上程序的局部性原理这两个基础的背景知识进行讲解。
不可言诉的深渊
2024/06/13
2650
SciPy 稀疏矩阵(5):CSR
scipy.sparse、pandas.sparse、sklearn稀疏矩阵的使用
单机环境下,如果特征较为稀疏且矩阵较大,那么就会出现内存问题,如果不上分布式 + 不用Mars/Dask/CuPy等工具,那么稀疏矩阵就是一条比较容易实现的路。
悟乙己
2021/12/07
1.9K0
scipy.sparse、pandas.sparse、sklearn稀疏矩阵的使用
SciPy 稀疏矩阵(6):CSC
上回说到,CSR 格式的稀疏矩阵基于程序的空间局部性原理把当前访问的内存地址以及周围的内存地址中的数据复制到高速缓存或者寄存器(如果允许的话)来对 LIL 格式的稀疏矩阵进行性能优化。但是,我们都知道,无论是 LIL 格式的稀疏矩阵还是 CSR 格式的稀疏矩阵全都把稀疏矩阵看成有序稀疏行向量组。然而,稀疏矩阵不仅可以看成是有序稀疏行向量组,还可以看成是有序稀疏列向量组。我们完全可以把稀疏矩阵看成是有序稀疏列向量组,然后模仿 LIL 格式或者是 CSR 格式对列向量组中的每一个列向量进行压缩存储。然而,模仿 LIL 格式的稀疏矩阵格式 SciPy 中并没有实现,大家可以尝试自己去模仿一下,这一点也不难。因此,这回直接介绍模仿 CSR 格式的稀疏矩阵格式——CSC 格式。
不可言诉的深渊
2024/06/25
2740
SciPy 稀疏矩阵(6):CSC
python的高级数组之稀疏矩阵
具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。
py3study
2020/01/16
3.1K0
python的高级数组之稀疏矩阵
稀疏矩阵的压缩方法
说明: 稀疏矩阵是机器学习中经常遇到的一种矩阵形式,特别是当矩阵行列比较多的时候,本着“节约”原则,必须要对其进行压缩。本节即演示一种常用的压缩方法,并说明其他压缩方式。
老齐
2022/01/04
5.4K0
稀疏矩阵的压缩方法
盘一盘 Python 特别篇 20 - SciPy 稀疏矩阵
和稠密矩阵相比,稀疏矩阵的最大好处就是节省大量的内存空间来储存零。稀疏矩阵本质上还是矩阵,只不过多数位置是空的,那么存储所有的 0 非常浪费。稀疏矩阵的存储机制有很多种 (列出常用的五种):
用户5753894
2020/08/06
2.1K0
推荐 | 微软SAR近邻协同过滤算法拆解(二)
推荐 | 微软SAR近邻协同过滤算法解析(一)前面这篇介绍了整个SAR算法,算法本身比较容易理解。本篇主要对一下里面有趣的小函数。
悟乙己
2021/12/07
1.1K0
推荐 | 微软SAR近邻协同过滤算法拆解(二)
Python 进阶视频课 - 6. SciPy 下
上节主要从插值、数值积分和优化三大功能介绍 scipy,下节从有限差分和线性回归两大功能来介绍 scipy。
用户5753894
2020/12/18
7170
Python 进阶视频课 - 6. SciPy 下
气象编程 | 科学计算库Scipy简易入门
Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
气象学家
2020/07/20
1.7K0
气象编程 | 科学计算库Scipy简易入门
【实验楼-Python 科学计算】SciPy - 科学计算库(下)
使用 eigvals 计算矩阵的特征值,使用 eig 同时计算矩阵的特征值与特征向量:
Ai学习的老章
2019/04/10
9570
【实验楼-Python 科学计算】SciPy - 科学计算库(下)
Python稀疏矩阵运算库scipy.sparse用法精要
1、稀疏矩阵的常见存储形式 bsr_matrix(arg1[, shape, dtype, copy, blocksize]) Block Sparse Row matrix coo_matrix(arg1[, shape, dtype, copy]) A sparse matrix in COOrdinate format. csc_matrix(arg1[, shape, dtype, copy]) Compressed Sparse Column matrix csr_matrix(arg1[, sh
Python小屋屋主
2018/04/16
8.1K0
Python稀疏矩阵运算库scipy.sparse用法精要
python中的scipy模块
scipy包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,统计,特殊函数等等。
狼啸风云
2019/08/31
5.6K0
Scipy 高级教程——稀疏矩阵
Scipy 提供了处理稀疏矩阵的工具,这对于处理大规模数据集中的稀疏数据是非常有效的。本篇博客将深入介绍 Scipy 中的稀疏矩阵功能,并通过实例演示如何应用这些工具。
Echo_Wish
2024/01/15
5260
推荐系统为什么使用稀疏矩阵?如何使用python的SciPy包处理稀疏矩阵
这意味着当我们在一个矩阵中表示用户(行)和行为(列)时,结果是一个由许多零值组成的极其稀疏的矩阵。
deephub
2020/05/18
2.8K0
【水了一篇】Scipy简单介绍
Scipy是基于Numpy的科学计算库,用于数学、科学、工程学等领域,很多有一些高阶抽象和物理模型需要使用Scipy。SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
全栈程序员站长
2022/09/13
1K0
SciPy 稀疏矩阵(4):LIL(上)
上回说到,无论是 COO 格式的稀疏矩阵还是 DOK 格式的稀疏矩阵,进行线性代数的矩阵运算的操作效率都非常低。至于如何优化线性代数的矩阵运算的操作效率,继续改进三元组的存储方式可能不好办了,需要换一种存储方式。至于存储方式也不需要我们去实现,SciPy 已经实现了这样的稀疏矩阵存储方式,它就是另一个板块,这个板块共有 4 种稀疏矩阵格式,分别是{BSR, CSC, CSR, LIL},这一回先介绍 LIL 格式的稀疏矩阵!
不可言诉的深渊
2024/01/12
3130
SciPy 稀疏矩阵(4):LIL(上)
SciPy 稀疏矩阵(3):DOK
散列表(Hash Table)是一种非常重要的数据结构,它允许我们根据键(Key)直接访问在内存存储位置的数据。这种数据结构是一种特殊类型的关联数组,对于每个键都存在一个唯一的值。它被广泛应用于各种程序设计和应用中,扮演着关键的角色。散列表的主要优点是查找速度快,因为每个元素都存储了它的键和值,所以我们可以直接访问任何元素,无论元素在数组中的位置如何。这种直接访问的特性使得散列表在处理查询操作时非常高效。因此,无论是进行数据检索、缓存操作,还是实现关联数组,散列表都是一种非常有用的工具。这种高效性使得散列表在需要快速查找和访问数据的场景中特别有用,比如在搜索引擎的索引中。散列表的基本实现涉及两个主要操作:插入(Insert)和查找(Lookup)。插入操作将一个键值对存储到散列表中,而查找操作则根据给定的键在散列表中查找相应的值。这两种操作都是 O(1) 时间复杂度,这意味着它们都能在非常短的时间内完成。这种时间复杂度在散列表与其他数据结构相比时,如二分搜索树或数组,显示出显著的优势。然而,为了保持散列表的高效性,我们必须处理冲突,即当两个或更多的键映射到同一个内存位置时。这是因为在散列表中,不同的键可能会被哈希到同一位置。这是散列表实现中的一个重要挑战。常见的冲突解决方法有开放寻址法和链地址法。开放寻址法是一种在散列表中解决冲突的方法,其中每个单元都存储一个键值对和一个额外的信息,例如,计数器或下一个元素的指针。当一个元素被插入到散列表中时,如果当前位置已经存在另一个元素,那么下一个空闲的单元将用于存储新的元素。然而,这个方法的一个缺点是,在某些情况下,可能会产生聚集效应,导致某些单元过于拥挤,而其他单元过于稀疏。这可能会降低散列表的性能。链地址法是一种更常见的解决冲突的方法,其中每个单元都存储一个链表。当一个元素被插入到散列表中时,如果当前位置已经存在另一个元素,那么新元素将被添加到链表的末尾。这种方法的一个优点是它能够处理更多的冲突,而且不会产生聚集效应。然而,它也有一个缺点,那就是它需要更多的空间来存储链表。总的来说,散列表是一种非常高效的数据结构,它能够快速地查找、插入和删除元素。然而,为了保持高效性,我们需要处理冲突并采取一些策略来优化散列表的性能。例如,我们可以使用再哈希(rehashing)技术来重新分配键,以更均匀地分布散列表中的元素,减少聚集效应。还可以使用动态数组或链表等其他数据结构来更好地处理冲突。这些优化策略可以显著提高散列表的性能,使其在各种应用中更加高效。
不可言诉的深渊
2023/09/12
4740
SciPy 稀疏矩阵(3):DOK
提升 Python 性能 - Numba 与 Cython
花下猫语:最近,读者微信群里又频繁聊到了 Python 的性能问题,这真是老生常谈了。我想起自己曾收藏过几篇关于如何提升性能的文章,似乎挺有帮助的,便去联系了下作者,现在已经取得转载授权啦。今天分享其中一篇,后续还会有其它相关分享,希望对读者们也有所帮助。
Python猫
2019/08/08
1.2K0
提升 Python 性能 - Numba 与 Cython
SciPy详解
在Python科学计算领域,SciPy是一个非常重要的库。它提供了许多用于数值计算、优化、积分、统计和许多其他科学计算任务的功能。SciPy构建在NumPy之上,为数学、科学和工程领域的广泛问题提供了高效的解决方案。本教程将介绍SciPy的主要功能和用法,并提供一些示例以帮助您快速入门。
Michel_Rolle
2024/02/07
2.9K0
相关推荐
scipy.sparse.csr_matrix
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验