" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)稀疏矩陣示例代碼

 更新時(shí)間:2017年06月09日 16:41:59   作者:bitcarmanlee  
本篇文章主要介紹了python實(shí)現(xiàn)稀疏矩陣示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

1.sparse模塊初探

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

第一步自然就是導(dǎo)入sparse模塊

>>> from scipy import sparse

然后help一把,先來看個(gè)大概

>>> help(sparse)

直接找到我們最關(guān)心的部分:

  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.

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

2.coo_matrix

coo_matrix是最簡單的存儲(chǔ)方式。采用三個(gè)數(shù)組row、col和data保存非零元素的信息。這三個(gè)數(shù)組的長度相同,row保存元素的行,col保存元素的列,data保存元素的值。一般來說,coo_matrix主要用來創(chuàng)建矩陣,因?yàn)閏oo_matrix無法對(duì)矩陣的元素進(jìn)行增刪改等操作,一旦矩陣創(chuàng)建成功以后,會(huì)轉(zhuǎn)化為其他形式的矩陣。

>>> 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]]

稍微需要注意的一點(diǎn)是,用coo_matrix創(chuàng)建矩陣的時(shí)候,相同的行列坐標(biāo)可以出現(xiàn)多次。矩陣被真正創(chuàng)建完成以后,相應(yīng)的坐標(biāo)值會(huì)加起來得到最終的結(jié)果。

3.dok_matrix與lil_matrix

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

>>> 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則是使用兩個(gè)列表存儲(chǔ)非0元素。data保存每行中的非零元素,rows保存非零元素所在的列。這種格式也很適合逐個(gè)添加元素,并且能快速獲取行相關(guān)的數(shù)據(jù)。

>>> 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] [] []]

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

4.dia_matrix

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

如果原始矩陣是個(gè)對(duì)角性很好的矩陣那壓縮率會(huì)非常高。

找了網(wǎng)絡(luò)上的一張圖,大家就很容易能看明白其中的原理。

這里寫圖片描述

5.csr_matrix與csc_matrix

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

同樣在網(wǎng)絡(luò)上找了一張圖,能比較好反映其中的原理。

這里寫圖片描述

看看在python里怎么使用:

>>> 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]])

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

我們?cè)倏纯次臋n中是怎么說的

 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比較適合用來做真正的矩陣運(yùn)算。

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

6.bsr_matrix

Block Sparse Row format,顧名思義,是按分塊的思想對(duì)矩陣進(jìn)行壓縮。

這里寫圖片描述

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決pycharm同一目錄下無法import其他文件

    解決pycharm同一目錄下無法import其他文件

    今天小編就為大家分享一篇解決pycharm同一目錄下無法import其他文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python+PyQt5開發(fā)一個(gè)圖片尺寸修改器

    Python+PyQt5開發(fā)一個(gè)圖片尺寸修改器

    我們?cè)谌粘^k公時(shí),經(jīng)常需要將圖片進(jìn)行修改尺寸,本文將使用python和PyQt5開發(fā)一個(gè)方便圖片修改尺寸工具,感興趣的小伙伴可以了解一下
    2025-03-03
  • Python基于property實(shí)現(xiàn)類的特性操作示例

    Python基于property實(shí)現(xiàn)類的特性操作示例

    這篇文章主要介紹了Python基于property實(shí)現(xiàn)類的特性,結(jié)合實(shí)例形式分析了使用property實(shí)現(xiàn)類的特性相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-06-06
  • Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作

    Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作

    這篇文章主要介紹了Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python全字段斷言之DeepDiff模塊詳解

    Python全字段斷言之DeepDiff模塊詳解

    這篇文章主要介紹了Python全字段斷言之DeepDiff模塊詳解,Python中也提供了deepdiff庫,常用來校驗(yàn)兩個(gè)對(duì)象是否一致,包含3個(gè)常用類,DeepDiff,DeepSearch和DeepHash,,需要的朋友可以參考下
    2023-08-08
  • Python使用BeautifulSoup進(jìn)行XPath和CSS選擇器定位

    Python使用BeautifulSoup進(jìn)行XPath和CSS選擇器定位

    在 Python 中,BeautifulSoup 是一個(gè)常用的 HTML 和 XML 解析庫,它允許我們輕松地定位和提取網(wǎng)頁中的特定元素,本文將詳細(xì)介紹如何在 BeautifulSoup 中使用 XPath 和 CSS 選擇器定位 HTML 元素,并提供示例代碼以幫助新手理解這些概念,需要的朋友可以參考下
    2024-11-11
  • Python 內(nèi)置函數(shù)之隨機(jī)函數(shù)詳情

    Python 內(nèi)置函數(shù)之隨機(jī)函數(shù)詳情

    這篇文章主要介紹了Python 內(nèi)置函數(shù)之隨機(jī)函數(shù),文章將圍繞Python 內(nèi)置函數(shù)、隨機(jī)函數(shù)的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • Python使用方法重載實(shí)現(xiàn)訪問者模式

    Python使用方法重載實(shí)現(xiàn)訪問者模式

    這篇文章主要為大家詳細(xì)介紹了Python如何使用方法重載實(shí)現(xiàn)訪問者模式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • python 生成器和迭代器的原理解析

    python 生成器和迭代器的原理解析

    這篇文章主要介紹了python 生成器和迭代器的原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python多線程的使用詳情

    Python多線程的使用詳情

    這篇文章主要介紹了Python多線程的使用詳情,線程之間執(zhí)行是無序的,cpu調(diào)度哪個(gè)線程就執(zhí)行哪個(gè)線程,下文相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論

柘荣县| 尚志市| 扎赉特旗| 恭城| 尚志市| 孝感市| 扶余县| 家居| 顺平县| 玛曲县| 景德镇市| 山东| 武定县| 扬州市| 册亨县| 青铜峡市| 民县| 万宁市| 南川市| 新和县| 石景山区| 涿州市| 肥城市| 米林县| 阳西县| 通榆县| 武平县| 泸定县| 三门县| 北海市| 亚东县| 牟定县| 宝清县| 科尔| 五华县| 滁州市| 东乌| 淅川县| 乳源| 北川| 巩留县|