一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python實現稀疏矩陣示例代碼

python實現稀疏矩陣示例代碼

2020-11-16 19:29bitcarmanlee Python

本篇文章主要介紹了python實現稀疏矩陣示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

工程實踐中,多數情況下,大矩陣一般都為稀疏矩陣,所以如何處理稀疏矩陣在實際中就非常重要。本文以Python里中的實現為例,首先來探討一下稀疏矩陣是如何存儲表示的。

1.sparse模塊初探

python中scipy模塊中,有一個模塊叫sparse模塊,就是專門為了解決稀疏矩陣而生。本文的大部分內容,其實就是基于sparse模塊而來的。

第一步自然就是導入sparse模塊

?
1
>>> from scipy import sparse

然后help一把,先來看個大概

?
1
>>> help(sparse)

直接找到我們最關心的部分:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Usage information
=================
 
There are seven available sparse matrix types:
 
  1. csc_matrix: Compressed Sparse Column format
  2. csr_matrix: Compressed Sparse Row format
  3. bsr_matrix: Block Sparse Row format
  4. lil_matrix: List of Lists format
  5. dok_matrix: Dictionary of Keys format
  6. coo_matrix: COOrdinate format (aka IJV, triplet format)
  7. dia_matrix: DIAgonal format
 
To construct a matrix efficiently, use either dok_matrix or lil_matrix.
The lil_matrix class supports basic slicing and fancy
indexing with a similar syntax to NumPy arrays. As illustrated below,
the COO format may also be used to efficiently construct matrices.
 
To perform manipulations such as multiplication or inversion, first
convert the matrix to either CSC or CSR format. The lil_matrix format is
row-based, so conversion to CSR is efficient, whereas conversion to CSC
is less so.
 
All conversions among the CSR, CSC, and COO formats are efficient,
linear-time operations.

通過這段描述,我們對sparse模塊就有了個大致的了解。sparse模塊里面有7種存儲稀疏矩陣的方式。接下來,我們對這7種方式來做個一一介紹。

2.coo_matrix

coo_matrix是最簡單的存儲方式。采用三個數組row、col和data保存非零元素的信息。這三個數組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。一般來說,coo_matrix主要用來創建矩陣,因為coo_matrix無法對矩陣的元素進行增刪改等操作,一旦矩陣創建成功以后,會轉化為其他形式的矩陣。

?
1
2
3
4
5
6
7
8
9
>>> row = [2,2,3,2]
>>> col = [3,4,2,3]
>>> c = sparse.coo_matrix((data,(row,col)),shape=(5,6))
>>> print c.toarray()
[[0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 5 2 0]
 [0 0 3 0 0 0]
 [0 0 0 0 0 0]]

稍微需要注意的一點是,用coo_matrix創建矩陣的時候,相同的行列坐標可以出現多次。矩陣被真正創建完成以后,相應的坐標值會加起來得到最終的結果。

3.dok_matrix與lil_matrix

dok_matrix和lil_matrix適用的場景是逐漸添加矩陣的元素。doc_matrix的策略是采用字典來記錄矩陣中不為0的元素。自然,字典的key存的是記錄元素的位置信息的元祖,value是記錄元素的具體值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> import numpy as np
>>> from scipy.sparse import dok_matrix
>>> S = dok_matrix((5, 5), dtype=np.float32)
>>> for i in range(5):
...   for j in range(5):
...       S[i, j] = i + j
...
>>> print S.toarray()
[[ 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.]]

lil_matrix則是使用兩個列表存儲非0元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個添加元素,并且能快速獲取行相關的數據。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> from scipy.sparse import lil_matrix
>>> l = lil_matrix((6,5))
>>> l[2,3] = 1
>>> l[3,4] = 2
>>> l[3,2] = 3
>>> print l.toarray()
[[ 0. 0. 0. 0. 0.]
 [ 0. 0. 0. 0. 0.]
 [ 0. 0. 0. 1. 0.]
 [ 0. 0. 3. 0. 2.]
 [ 0. 0. 0. 0. 0.]
 [ 0. 0. 0. 0. 0.]]
>>> print l.data
[[] [] [1.0] [3.0, 2.0] [] []]
>>> print l.rows
[[] [] [3] [2, 4] [] []]

由上面的分析很容易可以看出,上面兩種構建稀疏矩陣的方式,一般也是用來通過逐漸添加非零元素的方式來構建矩陣,然后轉換成其他可以快速計算的矩陣存儲方式。

4.dia_matrix

這是一種對角線的存儲方式。其中,列代表對角線,行代表行。如果對角線上的元素全為0,則省略。

如果原始矩陣是個對角性很好的矩陣那壓縮率會非常高。

找了網絡上的一張圖,大家就很容易能看明白其中的原理。

python實現稀疏矩陣示例代碼

5.csr_matrix與csc_matrix

csr_matrix,全名為Compressed Sparse Row,是按行對矩陣進行壓縮的。CSR需要三類數據:數值,列號,以及行偏移量。CSR是一種編碼的方式,其中,數值與列號的含義,與coo里是一致的。行偏移表示某一行的第一個元素在values里面的起始偏移位置。

同樣在網絡上找了一張圖,能比較好反映其中的原理。

python實現稀疏矩陣示例代碼

看看在python里怎么使用:

?
1
2
3
4
5
6
7
8
>>> 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_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 2],
    [0, 0, 3],
    [4, 5, 6]])

怎么樣,是不是也不是很難理解。

我們再看看文檔中是怎么說的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Notes
| -----
|
| Sparse matrices can be used in arithmetic operations: they support
| addition, subtraction, multiplication, division, and matrix power.
|
| Advantages of the CSR format
|  - efficient arithmetic operations CSR + CSR, CSR * CSR, etc.
|  - efficient row slicing
|  - fast matrix vector products
|
| Disadvantages of the CSR format
|  - slow column slicing operations (consider CSC)
|  - changes to the sparsity structure are expensive (consider LIL or DOK)

不難看出,csr_matrix比較適合用來做真正的矩陣運算。

至于csc_matrix,跟csr_matrix類似,只不過是基于列的方式壓縮的,不再單獨介紹。

6.bsr_matrix

Block Sparse Row format,顧名思義,是按分塊的思想對矩陣進行壓縮。

python實現稀疏矩陣示例代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/bitcarmanlee/article/details/52668477

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产四虎 | 日本综合在线观看 | 1769国产精品免费视频 | 国产黄频在线观看 | 国四虎影永久 | 免费视频完整版在线观看网站 | 亚洲欧洲淘宝天堂日本 | 日韩一本在线 | 免费日本视频 | 色综合网亚洲精品久久 | 亚洲第一天堂网 | 手机国产乱子伦精品视频 | 国产免费午夜 | 好大好热 | 日本免费v片一二三区 | 亚洲精品成人在线 | 国产色站| 强插美女 | 大又大又黄又爽免费毛片 | 国产一区二区精品 | 狠狠色综合久久久久尤物 | 天天爱综合网 | 四虎永久 | 国产欧美日韩精品高清二区综合区 | 欧美日韩一品道 | 边吃胸边膜下刺激免费男对女 | 2021久久| 国产短视频精品一区二区三区 | 91久久偷偷做嫩草影院免费 | 成熟女人50岁一级毛片不卡 | 亚洲社区在线 | 星空无限传媒视频在线观看视频 | 日本中文字幕在线视频站 | jazz中国女人护士 | 日本不卡一区二区三区在线观看 | 国产精品va在线观看手机版 | 极品ts赵恩静和直男激战啪啪 | 日本三级做a全过程在线观看 | 亚洲国产在线 | 香蕉精品视频 | 日韩精品视频福利资源站 |