python scipy 稀疏矩阵的使用说明

稀疏矩阵格式 coo_matrix

coo_matrix

是最简单的稀疏矩阵存储方式,采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息。

在实际使用中,一般coo_matrix用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改操作;创建成功之后可以转化成其他格式的稀疏矩阵(如csr_matrix、csc_matrix)进行转置、矩阵乘法等操作。

coo_matrix可以通过四种方式实例化,除了可以通过coo_matrix(D), D代表密集矩阵;coo_matrix(S), S代表其他类型稀疏矩阵或者coo_matrix((M, N), [dtype])构建一个shape为M*N的空矩阵,默认数据类型是d,还可以通过(row, col, data)三元组初始化:

>>> import numpy as np
>>> from scipy.sparse import coo_matrix
>>> _row  = np.array([0, 3, 1, 0])
>>> _col  = np.array([0, 3, 1, 2])
>>> _data = np.array([4, 5, 7, 9])
>>> coo = coo_matrix((_data, (_row, _col)), shape=(4, 4), dtype=np.int)
>>> coo.todense()  # 通过toarray方法转化成密集矩阵(numpy.matrix)
>>> coo.toarray()  # 通过toarray方法转化成密集矩阵(numpy.ndarray)
array([[4, 0, 9, 0],
       [0, 7, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 5]])

上面通过triplet format的形式构建了一个coo_matrix对象,我们可以看到坐标点(0,0)对应值为4,坐标点(1,1)对应值为7等等,这就是coo_matrix。coo_matrix对象有很多方法,大多数是elementwise的操作函数;coo_matrix对象有以下属性:

dtype dtype

矩阵中元素的数据类型

shape 2-tuple

获取矩阵的shape

ndim int

获取矩阵的维度,当然值是2咯

nnz

存储值的个数,包括显示声明的零元素(注意)

data

稀疏矩阵存储的值,是一个一维数组,即上面例子中的_data

row

与data同等长度的一维数组,表征data中每个元素的行号

col

与data同等长度的一维数组,表征data中每个元素的列号

在实际应用中,coo_matrix矩阵文件通常存成以下形式,表示稀疏矩阵是coo_matrix(coordinate),由13885行1列组成,共有949个元素值为非零,数据类型为整形。

​ 下面给出coo_matrix矩阵文件读写示例代码,mmread()用于读取稀疏矩阵,mmwrite()用于写入稀疏矩阵,mminfo()用于查看稀疏矩阵文件元信息。(这三个函数的操作不仅仅限于coo_matrix)

from scipy.io import mmread, mmwrite, mminfo
HERE = dirname(__file__)
coo_mtx_path = join(HERE, 'data/matrix.mtx')
coo_mtx = mmread(coo_mtx_path)
print(mminfo(coo_mtx_path))
# (13885, 1, 949, 'coordinate', 'integer', 'general')
# (rows, cols, entries, format, field, symmetry)
mmwrite(join(HERE, 'data/saved_mtx.mtx'), coo_mtx)

coo_matrix的优点:

有利于稀疏格式之间的快速转换(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil())

允许又重复项(格式转换的时候自动相加)

能与CSR / CSC格式的快速转换

coo_matrix的缺点:

不能直接进行算术运算

csr_matrix ​

csr_matrix,全称Compressed Sparse Row matrix,即按行压缩的稀疏矩阵存储方式,由三个一维数组indptr, indices, data组成。

这种格式要求矩阵元按行顺序存储,每一行中的元素可以乱序存储。

那么对于每一行就只需要用一个指针表示该行元素的起始位置即可。

indptr存储每一行数据元素的起始位置,indices这是存储每行中数据的列号,与data中的元素一一对应。

csr_matrix可用于各种算术运算:它支持加法,减法,乘法,除法和矩阵幂等操作。

其有五种实例化方法,其中前四种初始化方法类似coo_matrix,即通过密集矩阵构建、通过其他类型稀疏矩阵转化、构建一定shape的空矩阵、通过(row, col, data)构建矩阵。

其第五种初始化方式这是直接体现csr_matrix的存储特征:csr_matrix((data, indices, indptr), [shape=(M, N)]),意思是,矩阵中第i行非零元素的列号为indices[indptr[i]:indptr[i+1]],相应的值为data[indptr[i]:indptr[i+1]]

举个例子:

>>> import numpy as np
>>> from scipy.sparse import csr_matrix
>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csr = csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

csr_matrix同样有很多方法,其中tobytes(),tolist(), tofile(),tostring()值得注意,其他具体参考官方文档,csr_matrix对象属性前五个同coo_matrix,另外还有属性如下:

indices

与属性data一一对应,元素值代表在某一行的列号

indptr

csr_matrix各行的起始值,length(csr_object.indptr) == csr_object.shape[0] + 1

has_sorted_indices

判断每一行的indices是否是有序的,返回bool值

csr_matrix的优点:

高效的算术运算CSR + CSR,CSR * CSR等高效的行切片快速矩阵运算

csr_matrix的缺点:

列切片操作比较慢(考虑csc_matrix)稀疏结构的转换比较慢(考虑lil_matrix或doc_matrix)

csc_matrix

​ csc_matrix和csr_matrix正好相反,即按列压缩的稀疏矩阵存储方式,同样由三个一维数组indptr, indices, data组成,如下图所示:

其实例化方式、属性、方法、优缺点和csr_matrix基本一致,这里不再赘述,它们之间唯一的区别就是按行或按列压缩进行存储。

而这一区别决定了csr_matrix擅长行操作;csc_matrix擅长列操作,进行运算时需要进行合理存储结构的选择。

lil_matrix

​ lil_matrix,即List of Lists format,又称为Row-based linked list sparse matrix。它使用两个嵌套列表存储稀疏矩阵:data保存每行中的非零元素的值,rows保存每行非零元素所在的列号(列号是顺序排序的)。

这种格式很适合逐个添加元素,并且能快速获取行相关的数据。

其初始化方式同coo_matrix初始化的前三种方式:通过密集矩阵构建、通过其他矩阵转化以及构建一个一定shape的空矩阵。

lil_matrix可用于算术运算:支持加法,减法,乘法,除法和矩阵幂。其属性前五个同coo_matrix,另外还有rows属性,是一个嵌套List,表示矩阵每行中非零元素的列号。

LIL matrix本身的设计是用来方便快捷构建稀疏矩阵实例,而算术运算、矩阵运算则转化成CSC、CSR格式再进行,构建大型的稀疏矩阵还是推荐使用COO格式。

LIL format优点

支持灵活的切片操作行切片操作效率高,列切片效率低

稀疏矩阵格式之间的转化很高效(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil())

LIL format缺点

加法操作效率低 (consider CSR or CSC)

列切片效率低(consider CSC)

矩阵乘法效率低 (consider CSR or CSC)

dok_matrix ​

dok_matrix,即Dictionary Of Keys based sparse matrix,是一种类似于coo matrix但又基于字典的稀疏矩阵存储方式,key由非零元素的的坐标值tuple(row, column)组成,value则代表数据值。

dok matrix非常适合于增量构建稀疏矩阵,并一旦构建,就可以快速地转换为coo_matrix。

其属性和coo_matrix前四项同;其初始化方式同coo_matrix初始化的前三种:通过密集矩阵构建、通过其他矩阵转化以及构建一个一定shape的空矩阵。

对于dok matrix,可用于算术运算:它支持加法,减法,乘法,除法和矩阵幂;允许对单个元素进行快速访问( O(1) ); 不允许重复。

>>> import numpy as np
>>> from scipy.sparse import dok_matrix
>>> np.random.seed(10)
>>> matrix = random(3, 3, format='dok', density=0.4)
>>> matrix[1, 1] = 33
>>> matrix[2, 1] = 10
>>> matrix.toarray()
array([[ 0.        ,  0.        ,  0.        ],
       [ 0.        , 33.        ,  0.        ],
       [ 0.19806286, 10.        ,  0.22479665]])
>>> dict(matrix)
{(2, 0): 0.19806286475962398, (2, 1): 10.0, (2, 2): 0.22479664553084766, (1, 1): 33.0}
>>> isinstance(matrix, dict)
True

在上面代码最后可以看到,实际上dok_matrix实例也是dict实例,在实现上继承了dict类。

dia_matrix

​ dia_matrix,全称Sparse matrix with DIAgonal storage,是一种对角线的存储方式。

如下图中,将稀疏矩阵使用offsets和data两个矩阵来表示。offsets表示data中每一行数据在原始稀疏矩阵中的对角线位置k(k>0, 对角线往右上角移动;k<0, 对角线往左下方移动;k=0,主对角线)。

该格式的稀疏矩阵可用于算术运算:它们支持加法,减法,乘法,除法和矩阵幂。

​dia_matrix五个属性同coo matrix, 另外还有属性offsets;dia_matrix有四种初始化方式,其中前三种初始化方式同coo_matrix前三种初始化方式,即:通过密集矩阵构建、通过其他矩阵转化以及构建一个一定shape的空矩阵。

第四种初始化方式如下:

dia_matrix((data, offsets), shape=(M, N)) ,

​ 其中,data[k,:]存储着稀疏矩阵offsets[k]对角线上的值

>>> data = np.arange(15).reshape(3, -1) + 1
>>> offsets = np.array([0, -3, 2])
>>> dia = sparse.dia_matrix((data, offsets), shape=(7, 5))
>>> dia.toarray()
array([[ 1,  0, 13,  0,  0],
       [ 0,  2,  0, 14,  0],
       [ 0,  0,  3,  0, 15],
       [ 6,  0,  0,  4,  0],
       [ 0,  7,  0,  0,  5],
       [ 0,  0,  8,  0,  0],
       [ 0,  0,  0,  9,  0]])

不是很常用,了解即可

bsr_matrix

​ bsr_matrix,全称Block Sparse Row matrix,这种压缩方式极其类似CSR格式,但使用分块的思想对稀疏矩阵进行按行压缩。所以,BSR适用于具有dense子矩阵的稀疏矩阵。该种矩阵有五种初始化方式,分别如下:

bsr_matrix(D, [blocksize=(R,C)])

D是一个M*N的二维dense矩阵;blocksize需要满足条件:M % R = 0和N % C = 0,若不给定该参数,内部将会应用启发式的算法自动决定一个合适的blocksize.

bsr_matrix(S, [blocksize=(R,C)])

S是指其他类型的稀疏矩阵

bsr_matrix((M, N), [blocksize=(R,C), dtype])

构建一个shape为M*N的空矩阵

bsr_matrix((data, ij), [blocksize=(R,C), shape=(M, N)])

data 和ij 满足条件: a[ij[0, k], ij[1, k]] = data[k]

bsr_matrix((data, indices, indptr), [shape=(M, N)])

data.shape一般是k*R*C,其中R、C分别代表block的行和列长,k代表有几个小block矩阵;第i行的块列索引存储在indices[indptr[i]:indptr[i+1]],其值是data[ indptr[i]: indptr[i+1] ]。

bsr_matrix可用于算术运算:支持加法,减法,乘法,除法和矩阵幂。如下面的例子,对于许多稀疏算术运算,BSR比CSR和CSC更有效:

>>> from scipy.sparse import bsr_matrix
>>> import numpy
>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6]).repeat(4).reshape(6, 2, 2)
>>> bsr_matrix((data,indices,indptr), shape=(6, 6)).toarray()
array([[1, 1, 0, 0, 2, 2],
       [1, 1, 0, 0, 2, 2],
       [0, 0, 0, 0, 3, 3],
       [0, 0, 0, 0, 3, 3],
       [4, 4, 5, 5, 6, 6],
       [4, 4, 5, 5, 6, 6]])

可以通过热图观察矩阵有没有明显分块模式再决定使不使用该方式

bsr matrix对象拥有9个属性,前四个属性与coo matrix相同,另外还有以下属性(注意csr matrix和bsr matrix之间的区别与联系):

data

即稀疏矩阵的数组,data.shape一般是k*R*C

indices

与属性data中的k个二维矩阵一一对应,元素值代表在某一行的列号

indptr

bsr各行起始起始值

blocksize

即tuple(R,C)

has_sorted_indices

判断每一行的indices是否是有序的,返回bool值

实用函数

构造特殊稀疏矩阵

scipy.sparse模块还包含一些便捷函数,用于快速构建单位矩阵、对角矩阵等,下面做一个简单的汇总:

方法 用途
identity(n[, dtype, format]) 生成稀疏单位矩阵
kron(A, B[, format]) sparse matrices A 和 B的克罗内克积
kronsum(A, B[, format]) sparse matrices A 和 B的克罗内克和
diags(diagonals[, offsets, shape, format, dtype]) 构建稀疏对角阵
spdiags(data, diags, m, n[, format]) 构建稀疏对角阵,同上,但不可指定shape
block_diag(mats[, format, dtype]) mats为iterable, 包含多个矩阵,根据mats构建块对角稀疏矩阵。
tril(A[, k, format]) 以稀疏格式返回矩阵的下三角部分
triu(A[, k, format]) 以稀疏格式返回矩阵的上三角部分
bmat(blocks[, format, dtype]) 从稀疏子块构建稀疏矩阵
hstack(blocks[, format, dtype]) 水平堆叠稀疏矩阵(column wise)
vstack(blocks[, format, dtype]) 垂直堆叠稀疏矩阵 (row wise)
rand(m, n[, density, format, dtype, …]) 使用均匀分布的值生成给定形状和密度的稀疏矩阵
random(m, n[, density, format, dtype, …]) 使用随机分布的值生成给定形状和密度的稀疏矩阵
eye(m[, n, k, dtype, format]) 生成稀疏单位对角阵(默认DIAgonal format)

​ scipy.sparse.bmat举例:

In [1]: A = np.arange(8).reshape(2, 4)
In [2]: T = np.tri(5, 4)
In [3]: L = [[8] * 4] * 2
In [4]: I = sparse.identity(4)
In [5]: Z = sparse.coo_matrix((2, 3))
In [6]: sp.bmat([[   A,    Z,    L],
    ...:          [None, None,    I],
    ...:          [   T, None, None]], dtype=int)
Out[7]:
<11x11 sparse matrix of type '<class 'numpy.int64'>'
        with 33 stored elements in COOrdinate format>
In [8]: _.toarray()  # ipython previous output
Out[9]:
array([[0, 1, 2, 3, 0, 0, 0, 8, 8, 8, 8],
       [4, 5, 6, 7, 0, 0, 0, 8, 8, 8, 8],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]])

稀疏矩阵类型判断

scipy.sparse模块还包含一些判断稀疏矩阵类型的函数,这里需要注意的是,issparse() 和 isspmatrix() 是相同的函数,也许是由于历史原因保留下来了两个。

isspars(x)
isspmatrix(x)
isspmatrix_csc(x)
isspmatrix_csr(x)
isspmatrix_bsr(x)
isspmatrix_lil(x)
isspmatrix_dok(x)
isspmatrix_coo(x)
isspmatrix_dia(x)

稀疏矩阵存取

load_npz(file) 从.npz文件中读取稀疏矩阵

save_npz(file, matrix[,compressed]) 将稀疏矩阵写入.npz文件中

其他

find(A) 返回稀疏矩阵中非零元素的索引以及值

经验总结

要有效地构造矩阵,请使用dok_matrix或lil_matrix

lil_matrix类支持基本切片和花式索引,其语法与NumPy Array类似;lil_matrix形式是基于row的,因此能够很高效的转为csr,但是转为csc效率相对较低。

强烈建议不要直接使用NumPy函数运算稀疏矩阵

如果你想将NumPy函数应用于这些矩阵,首先要检查SciPy是否有自己的给定稀疏矩阵类的实现,或者首先将稀疏矩阵转换为NumPy数组(使用类的toarray()方法)。

要执行乘法或转置等操作,首先将矩阵转换为CSC或CSR格式,效率高

CSR格式特别适用于快速矩阵矢量产品

CSR,CSC和COO格式之间的所有转换都是线性复杂度。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python使用scipy保存图片的一些注意点

    首先我们载入一张灰度图片,一般灰度图片像素为0-255. 可以发现该图片的最大像素为254,最小像素为2.一般处理图片时会转化为double类型. 我们将图片使用scipy保存为pgm格式. 然后我们重新读取该图片信息. 其像素值发生了变化,自动标准化到了0-255范围,最小值变为0,最大值变为255. 所以,使用scipy保存图像时,加上2个参数,cmin和cmax.就可以了 重新读取图片.结果正确 补充:from scipy import misc 读取和保存图片 from scipy im

  • windows下python 3.9 Numpy scipy和matlabplot的安装教程详解

    学习python过程中想使用python的matlabplot绘图功能,遇到了一大批问题,然后一路过关斩将,最终安装成功,实为不易,发帖留念. 1 首先打开cmd win+r 2 pip安装 pip3 install --user numpy scipy matplotlib –user 选项可以设置只安装在当前的用户下,而不是写入到系统目录.默认情况使用国外线路,国外太慢,我们使用清华的镜像就可以: pip3 install numpy scipy matplotlib -i https://

  • python的scipy.stats模块中正态分布常用函数总结

    python的scipy.stats模块是连续型随机变量的公共方法,可以产生随机数,通常是以正态分布作为scipy.stats的基本使用方法.本文介绍正态分布的两种常用函数:1.累积概率密度函数stats.norm.cdf(α,均值,方差):2.概率密度函数stats.norm.pdf(α,均值,方差). 1.stats.norm.cdf(α,均值,方差):累积概率密度函数 使用格式 status.norm.cdf(Norm) # 相当于已知正态分布函数曲线和x值,求函数x点左侧积分 使用实例

  • python简单实现最大似然估计&scipy库的使用详解

    python简单实现最大似然估计 1.scipy库的安装 wim+R输入cmd,然后cd到python的pip路径,即安装:pip install scipy即可 2.导入scipy库 from scipy.sats import norm 导入scipy.sats中的norm 3.案例分析 from scipy.stats import norm import matplotlib.pyplot as plt import numpy as np ''' norm.cdf 返回对应的累计分布函

  • python中scipy.stats产生随机数实例讲解

    python的numpy 能生成一定概率分布的随机数,但如果需要更具体的概率密度,累积概率,就要使用scipy.stats.scipy.stats用于统计分析,统计工具和随机过程的概率,各个随机过程的随机数生成器可以从numpy.random中找到.本文介绍python中使用scipy.stats产生随机数的原理及实例. 1.scipy.stats正态分步格式 scipy.stats #生成指定分布 scipy.stats.poisson.rvs(loc=期望, scale=标准差, size=

  • python scipy.misc.imsave()函数的用法说明

    这个函数用于储存图片,将数组保存为图像 此功能仅在安装了Python Imaging Library(PIL)时可用.版本也比较老了,新的替代它的是imageio.imwrite() 用法: imsave(*args, **kwds) 参数: name :文件名或者文件名加目录 arr:np-array的矩阵,MxN or MxNx3 or MxNx4这三种格式,分别对应灰度图像,RGB图像和RGB+alpha图像 format :str型,图像输出的类型,省略的话,图片直接输出图片的扩展名.

  • python scipy 稀疏矩阵的使用说明

    稀疏矩阵格式 coo_matrix coo_matrix 是最简单的稀疏矩阵存储方式,采用三元组(row, col, data)(或称为ijv format)的形式来存储矩阵中非零元素的信息. 在实际使用中,一般coo_matrix用来创建矩阵,因为coo_matrix无法对矩阵的元素进行增删改操作:创建成功之后可以转化成其他格式的稀疏矩阵(如csr_matrix.csc_matrix)进行转置.矩阵乘法等操作. coo_matrix可以通过四种方式实例化,除了可以通过coo_matrix(D)

  • Python scipy的二维图像卷积运算与图像模糊处理操作示例

    本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作.分享给大家供大家参考,具体如下: 二维图像卷积运算 一 代码 import numpy as np from scipy import signal, misc import matplotlib.pyplot as plt image = misc.ascent()#二维图像数组,lena图像 w = np.zeros((50,50))#全0二维数组,卷积核 w[0][0]=1.0#修改参数,调整滤波器 w[49][2

  • python scipy求解非线性方程的方法(fsolve/root)

    使用scipy.optimize模块的root和fsolve函数进行数值求解线性及非线性方程,下面直接贴上代码,代码很简单 from scipy.integrate import odeint import numpy as np import matplotlib.pyplot as plt from scipy.optimize import root,fsolve #plt.rc('text', usetex=True) #使用latex ## 使用scipy.optimize模块的roo

  • 对Python Pexpect 模块的使用说明详解

    背景介绍 Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程,整体来说大致的流程包括: 运行程序 程序要求人的判断和输入 Expect 通过关键字匹配 根据关键字向程序发送符合的字符串 TCL 语言实现的 Expect 功能非常强大,我曾经用它实现了防火墙

  • Python urllib3软件包的使用说明

    urllib3是一款Python 3的HTTP客户端. Python标准库提供了urllib.在Python 2中,另外提供了urllib2:而在Python 3中,重构了urllib和urllib2到标准库urllib,并另外提供了urllib3. 1. urllib3的特性 线程安全 连接缓冲池 客户端SSL/TLS验证 文件上传 请求重试 HTTP重定向 支持gzip和deflate encoding 支持HTTP和SOCKS的代理 2. 安装 urllib3不是Python 3的标准库,

  • python scipy.spatial.distance 距离计算函数  

    目录 1scipy.spatial 2scipy.spatial.distance.cdist 2.1语法 2.2metric的取值 2.3常用欧氏距离计算 1 scipy.spatial from scipy import spatial 在scipy.spatial中最重要的模块应该就是距离计算模块distance了. 2 scipy.spatial.distance.cdist 2.1 语法 scipy.spatial.distance.cdist(XA, XB, metric='eucl

  • Python+Scipy实现自定义任意的概率分布

    目录 连续变量分布 离散变量分布 二项分布Binomial Distribution 几何分布Geometric Distribution 泊松分布Poisson Distribution Scipy自带了多种常见的分布,如正态分布.均匀分布.二项分布.多项分布.伽马分布等等,还可以自定义任意的概率分布.本文将介绍如何利用Scipy自定义任意的概率分布. 连续变量分布 考虑连续变量x满足如下概率密度分布函数: 其在实数域积分为1.我们可以通过scipy.stats中的rv_continuous类

  • python实现稀疏矩阵示例代码

    工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要.本文以Python里中的实现为例,首先来探讨一下稀疏矩阵是如何存储表示的. 1.sparse模块初探 python中scipy模块中,有一个模块叫sparse模块,就是专门为了解决稀疏矩阵而生.本文的大部分内容,其实就是基于sparse模块而来的. 第一步自然就是导入sparse模块 >>> from scipy import sparse 然后help一把,先来看个大概 >>> h

  • Python使用稀疏矩阵节省内存实例

    推荐系统中经常需要处理类似user_id, item_id, rating这样的数据,其实就是数学里面的稀疏矩阵,scipy中提供了sparse模块来解决这个问题,但scipy.sparse有很多问题不太合用: 1.不能很好的同时支持data[i, ...].data[..., j].data[i, j]快速切片: 2.由于数据保存在内存中,不能很好的支持海量数据处理. 要支持data[i, ...].data[..., j]的快速切片,需要i或者j的数据集中存储:同时,为了保存海量的数据,也需

  • 详解利用Python scipy.signal.filtfilt() 实现信号滤波

    本文将以实战的形式基于scipy模块使用Python实现简单滤波处理,包括内容有1.低通滤波,2.高通滤波,3.带通滤波,4.带阻滤波器.具体的含义大家可以查阅大学课程,信号与系统.简单的理解就是低通滤波指的是去除高于某一阈值频率的信号:高通滤波去除低于某一频率的信号:带通滤波指的是类似低通高通的结合保留中间频率信号:带阻滤波也是低通高通的结合只是过滤掉的是中间部分.上面所说的内容会在实战部分加以介绍,可以对比理解一下. 如何实现的呢?我的理解,是通过时域转换为频域,在频域信号中去除相应频域信号

随机推荐