在 Python 中产生稀疏矩阵一般使用的是 scipy
包中的 sprase.rand
方法,但是产生的是 0-1 区间内的 均匀分布的数,于是便自己写了个生成 高斯分布的随机稀疏矩阵函数。
安装 numpy
和 scipy
包:
pip install -i https://mirrors.aliyun.com/pypi/simple scipy numpy
对标 MATLAB 中的 sprand
函数,我们使用 scipy 中的 sprase.rand
方法即可:
from scipy.sparse import rand
产生一个 m m m 行 n n n 列的服从均匀分布的随机稀疏矩阵,其中 p = 0.1
代表非零元素在此矩阵中所占比例为 10%:
m, n, p = 20, 1, 0.1
M = rand(m, n, p)
矩阵 M 如下:
In [8]: print(M)
(1, 0) 0.6736398867550694
(6, 0) 0.990450623569146
注意这里 M 的类型并不是数组,而是 scipy.sparse.coo.coo_matrix
对象,可使用 toarray()
方法或 todense()
方法转换为 matrix 对象或 array 对象。
In [10]: type(M.toarray())
Out[10]: numpy.ndarray
In [11]: type(M.todense())
Out[11]: numpy.matrix
在 scipy 的 sprase 模块中并未看到由此方法,便自己写了个函数,使用了 scipy 包中的 coo_matrix
方法,对标 MATLAB 中的 sprandn
函数:
import numpy as np
from scipy.sparse import coo_matrix
自定义函数如下:
def sprase_rand(m, n, p):
'''
Imports
-------
import numpy as np
from scipy.sparse import coo_matrix
Parameters
----------
m : int
Rows of generate sprase-matrix.
n : int
Columns of generate sprase-matrix.
p : float
Proportion of non-zero elements in sparse-matrix.
Returns
-------
scipy.sparse.coo.coo_matrix
Returns a random generated sprase-matrix(m x n) M,
try print(M) to see it or use M.toarray() for trans
M to an array. (Gaussian distribution)
Version: 1.0 writen by z.q.feng @2022.03.13
'''
if type(m) != int or type(n) != int:
raise TypeError('Rows(m) and Columns(n) must be an interger!')
if p 0 or p > 1:
raise ValueError('p must in (0, 1] !')
count = int(m * n * p)
rows = np.random.randint(0, m, count)
cols = np.random.randint(0, n, count)
data = np.random.randn(len(rows))
return coo_matrix((data, (rows, cols)), shape=(m, n))
同理,m , n m, n m ,n 分别为矩阵行数和列数,p p p 为稀疏矩阵中非零元素所占比例,返回的是一个 scipy.sparse.coo.coo_matrix
对象:
m, n, p = 100, 1, 0.1
M = sprase_rand(m, n, p)
生成稀疏矩阵如下:
In [17]: print(M)
(41, 0) 0.5449276858941307
(35, 0) -0.025833278679116962
(92, 0) -0.669275138440353
(4, 0) 0.8758045217206215
(3, 0) 1.989912762888745
(0, 0) 0.11984808162782133
(10, 0) 1.3130062796121102
(31, 0) 0.3581633202721068
(33, 0) 1.0432754388670364
(62, 0) 0.4063437334997744
同理,可使用 toarray()
方法或 todense()
方法填充转换为 matrix 对象或 array 对象。
不喜欢写总结。
Original: https://blog.csdn.net/weixin_46584887/article/details/123463305
Author: Z.Q.Feng
Title: 在Python中创建、生成稀疏矩阵(均匀分布、高斯分布)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/758672/
转载文章受原作者版权保护。转载请注明原作者出处!