从下面的Scipy官网对Scipy的描述可以发现:其实SciPy是基于python的用于数学、科学以及工程计算的开源生态系统。数据分析常用的numpy,pandas,matplotlib包都包含在这里面,scipy包自然也就包含在里面了。
SciPy (pronounced “Sigh Pie”) is a Python-based ecosystem of open-source software for mathematics, science, and engineering. In particular, these are some of the core packages:Numpy, SciPy library, Matplotlib, IPython, Sympy and Pandas.
——[SciPy.org]
Scipy官网还对scipy包进行了简单的介绍。
Scipy library : Fundamental library for scientific computing
The SciPy library is one of the core packages that make up the SciPy stack. It provides many user-friendly and efficient numerical routines such as routines for numerical integration and optimization.
scipy包下包含许多数学计算优化的函数,最近由于接触到向量化的python操作,发现sklearn.feature_extraction.text.CountVectorizer函数在调用fit_transform()后得到的数据格式是sparse matrix (稀疏矩阵) 格式的,再经过资料查找知道这个数据类型是属于scipy.sparse,对应形式如下。
<178444x1838 sparse matrix of type 'numpy.int64'>'
with 10950 stored elements in Compressed Sparse Row format>
很多资料都有稀疏矩阵的定义,以下截取自百度百科。
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。
——[百度百科]
进一步,在scipy.sparse的官方介绍网站下定义了以下七种稀疏矩阵以及基矩阵,还有稀疏矩阵的各种函数。
>>> '''
BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引,即indices[indptr[i]:indptr[i+1]]为第i行元素的列索引,data[indptr[i]: indptr[i+1]]为第i行元素的data。
在下面的例子中,对于第0行,indptr[0]:indptr[1] -> 0:2, 因此第0行的列为indice[0:2]=[0,2],data为data[0:2]=array([[[1, 1],[1, 1]],[[2, 2],[2, 2]]]),对应的就是最后结果的第0,1行。
'''
>>> 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]])
>>> '''
不难发现,coo_matrix是可以根据行和列索引进行data值的累加。
'''
>>> row = np.array([0, 0, 1, 3, 1, 0, 0])
>>> col = np.array([0, 2, 1, 3, 1, 0, 0])
>>> data = np.array([1, 1, 1, 1, 1, 1, 1])
>>> coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
array([[3, 0, 1, 0],
[0, 2, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 1]])
csc_matrix(arg1[, shape, dtype, copy])
Compressed Sparse Column matrix
csc_matrix的初始化方法可以是bsr_matrix的初始化方法,也可以是coo_matrix的初始化方法,该csc_matrix与下面的csr_matrix是比较常用的稀疏矩阵。
csr_matrix(arg1[, shape, dtype, copy])
Compressed Sparse Row matrix
csr_matrix的初始化与csc_matrix一致。
dia_matrix(arg1[, shape, dtype, copy])
Sparse matrix with DIAgonal storage
>>> #data定义对角线元素,在这里是[1,2,3,4]。
>>> data = np.array([[1, 2, 3, 4]]).repeat(3, axis=0)
>>> #offsets定义对角线的偏移量,0代表正对角线,正数代表往上偏移,负数代表往下偏移
>>> offsets = np.array([0, -1, 2])
>>> dia_matrix((data, offsets), shape=(4, 4)).toarray()
array([[1, 0, 3, 0],
[1, 2, 0, 4],
[0, 2, 3, 0],
[0, 0, 3, 4]])
>>> S = dok_matrix((5, 5), dtype=np.float32)
>>> for i in range(5):
... for j in range(5):
... S[i, j] = i + j
>>> S.toarray()
array([[0., 1., 2., 3., 4.],
[1., 2., 3., 4., 5.],
[2., 3., 4., 5., 6.],
[3., 4., 5., 6., 7.],
[4., 5., 6., 7., 8.]], dtype=float32)
lil_matrix(arg1[, shape, dtype, copy])
Row-based linked list sparse matrix
与dok_matrix类似,也是可以高效地插入元素更新矩阵。
spmatrixSparse([maxprint])
上面所有稀疏矩阵类型的基类型,不能被实例化
注意除最后一个基矩阵以外,其他七种稀疏矩阵都可以用以下方式(1、指定行索引、列索引以及对应的数据;2、指定array;3、稀疏矩阵之间的转化)来初始化,我们稀疏矩阵类型函数模板化为sparse_matrix。
>>> #行索引
>>> row = np.array([0, 3, 1, 0])
>>> #列索引
>>> col = np.array([0, 3, 1, 2])
>>> #具体数据
>>> data = np.array([4, 5, 7, 9])
>>> #第一种方式
>>> sparse_matrix((data, (row, col)), shape=(4, 4)).toarray()
array([[4, 0, 9, 0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
>>> #第二种方式(array可以是list,也可以是np.array)
>>> sparse_matrix(array).toarray()
>>> #第三种方式(sparse_matrix_other为其他稀疏矩阵类型,等价于sparse_matrix_other.tosparse(),具体的内函数形式根据需要转化的sparse_matrix类型而定)
>>> sparse_matrix(sparse_matrix_other).toarray()
下面我只列出比较有用的函数,其他的函数可以参见scipy.sparse官网。
下面的函数只针对csr_matrix列出,其他稀疏矩阵格式的函数也类似,具体可以查看对应稀疏矩阵的说明文档下面的函数说明部分。
内函数中有很多作用在矩阵元素的函数,下面列出一些函数。
- arcsin():每个元素进行arcsin运算
- floor():每个元素进行floor运算
- sqrt():每个元素进行sqrt运算
- maximum(other):比较稀疏矩阵与other矩阵的每个元素,返回最大值