亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

NumPy實(shí)現(xiàn)多維數(shù)組中的線性代數(shù)

 更新時(shí)間:2021年07月30日 10:40:30   作者:程序那些事  
本文主要介紹了NumPy實(shí)現(xiàn)多維數(shù)組中的線性代數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

本文將會(huì)以圖表的形式為大家講解怎么在NumPy中進(jìn)行多維數(shù)據(jù)的線性代數(shù)運(yùn)算。
多維數(shù)據(jù)的線性代數(shù)通常被用在圖像處理的圖形變換中,本文將會(huì)使用一個(gè)圖像的例子進(jìn)行說(shuō)明。

圖形加載和說(shuō)明

熟悉顏色的朋友應(yīng)該都知道,一個(gè)顏色可以用R,G,B來(lái)表示,如果更高級(jí)一點(diǎn),那么還有一個(gè)A表示透明度。通常我們用一個(gè)四個(gè)屬性的數(shù)組來(lái)表示。

對(duì)于一個(gè)二維的圖像來(lái)說(shuō),其分辨率可以看做是一個(gè)X*Y的矩陣,矩陣中的每個(gè)點(diǎn)的顏色都可以用(R,G,B)來(lái)表示。

有了上面的知識(shí),我們就可以對(duì)圖像的顏色進(jìn)行分解了。

首先需要加載一個(gè)圖像,我們使用imageio.imread方法來(lái)加載一個(gè)本地圖像,如下所示:

import imageio
img=imageio.imread('img.png')
print(type(img))

上面的代碼從本地讀取圖片到img對(duì)象中,使用type可以查看img的類(lèi)型,從運(yùn)行結(jié)果,我們可以看到img的類(lèi)型是一個(gè)數(shù)組。

class 'imageio.core.util.Array'

通過(guò)img.shape可以得到img是一個(gè)(80, 170, 4)的三維數(shù)組,也就是說(shuō)這個(gè)圖像的分辨率是80*170,每個(gè)像素是一個(gè)(R,B,G,A)的數(shù)組。

最后將圖像畫(huà)出來(lái)如下所示:

import matplotlib.pyplot as plt
plt.imshow(img)

圖形的灰度

對(duì)于三維數(shù)組來(lái)說(shuō),我們可以分別得到三種顏色的數(shù)組如下所示:

red_array = img_array[:, :, 0]
green_array = img_array[:, :, 1]
blue_array = img_array[:, :, 2]

有了三個(gè)顏色之后我們可以使用下面的公式對(duì)其進(jìn)行灰度變換:

Y=0.2126R + 0.7152G + 0.0722B

上圖中Y表示的是灰度。
怎么使用矩陣的乘法呢?使用 @ 就可以了:

 img_gray = img_array @ [0.2126, 0.7152, 0.0722]

現(xiàn)在img是一個(gè)80 * 170的矩陣。
現(xiàn)在使用cmap="gray"作圖:

plt.imshow(img_gray, cmap="gray")

可以得到下面的灰度圖像:

灰度圖像的壓縮

灰度圖像是對(duì)圖像的顏色進(jìn)行變換,如果要對(duì)圖像進(jìn)行壓縮該怎么處理呢?

矩陣運(yùn)算中有一個(gè)概念叫做奇異值和特征值。

設(shè)A為n階矩陣,若存在常數(shù)λ及n維非零向量x,使得Ax=λx,則稱(chēng)λ是矩陣A的特征值,x是A屬于特征值λ的特征向量。

一個(gè)矩陣的一組特征向量是一組正交向量。

即特征向量被施以線性變換 A 只會(huì)使向量伸長(zhǎng)或縮短而其方向不被改變。

特征分解(Eigendecomposition),又稱(chēng)譜分解(Spectral decomposition)是將矩陣分解為由其特征值和特征向量表示的矩陣之積的方法。

假如A是m * n階矩陣,q=min(m,n),A*A的q個(gè)非負(fù)特征值的算術(shù)平方根叫作A的奇異值。

特征值分解可以方便的提取矩陣的特征,但是前提是這個(gè)矩陣是一個(gè)方陣。如果是非方陣的情況下,就需要用到奇異值分解了。先看下奇異值分解的定義:

A=UΣVT

其中A是目標(biāo)要分解的m * n的矩陣,U是一個(gè) m * m的方陣,Σ 是一個(gè)m * n 的矩陣,其非對(duì)角線上的元素都是0。VTV^TVT是V的轉(zhuǎn)置,也是一個(gè)n * n的矩陣。

奇異值跟特征值類(lèi)似,在矩陣Σ中也是從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上了。也就是說(shuō),我們也可以用前r大的奇異值來(lái)近似描述矩陣。r是一個(gè)遠(yuǎn)小于m、n的數(shù),這樣就可以進(jìn)行壓縮矩陣。

通過(guò)奇異值分解,我們可以通過(guò)更加少量的數(shù)據(jù)來(lái)近似替代原矩陣。

要想使用奇異值分解svd可以直接調(diào)用linalg.svd 如下所示:

U, s, Vt = linalg.svd(img_gray)

其中U是一個(gè)m * m矩陣,Vt是一個(gè)n * n矩陣。

在上述的圖像中,U是一個(gè)(80, 80)的矩陣,而Vt是一個(gè)(170, 170) 的矩陣。而s是一個(gè)80的數(shù)組,s包含了img中的奇異值。

如果將s用圖像來(lái)表示,我們可以看到大部分的奇異值都集中在前的部分:

這也就意味著,我們可以取s中前面的部分值來(lái)進(jìn)行圖像的重構(gòu)。
使用s對(duì)圖像進(jìn)行重構(gòu),需要將s還原成80 * 170 的矩陣:

# 重建
import numpy as np
Sigma = np.zeros((80, 170))
for i in range(80):
    Sigma[i, i] = s[i]

使用 U @ Sigma @ Vt 即可重建原來(lái)的矩陣,可以通過(guò)計(jì)算linalg.norm來(lái)比較一下原矩陣和重建的矩陣之間的差異。

linalg.norm(img_gray - U @ Sigma @ Vt)

或者使用np.allclose來(lái)比較兩個(gè)矩陣的不同:

np.allclose(img_gray, U @ Sigma @ Vt)

或者只取s數(shù)組的前10個(gè)元素,進(jìn)行重新繪圖,比較一下和原圖的區(qū)別:

k = 10
approx = U @ Sigma[:, :k] @ Vt[:k, :]
plt.imshow(approx, cmap="gray")

可以看到,差異并不是很大:

原始圖像的壓縮

上一節(jié)我們講到了如何進(jìn)行灰度圖像的壓縮,那么如何對(duì)原始圖像進(jìn)行壓縮呢?

同樣可以使用linalg.svd對(duì)矩陣進(jìn)行分解。

但是在使用前需要進(jìn)行一些處理,因?yàn)樵紙D像的img_array 是一個(gè)(80, 170, 3)的矩陣--這里我們將透明度去掉了,只保留了R,B,G三個(gè)屬性。

在進(jìn)行轉(zhuǎn)換之前,我們需要把不需要變換的軸放到最前面,也就是說(shuō)將index=2,換到index=0的位置,然后進(jìn)行svd操作:

img_array_transposed = np.transpose(img_array, (2, 0, 1))
print(img_array_transposed.shape)

U, s, Vt = linalg.svd(img_array_transposed)
print(U.shape, s.shape, Vt.shape)

同樣的,現(xiàn)在s是一個(gè)(3, 80)的矩陣,還是少了一維,如果重建圖像,需要將其進(jìn)行填充和處理,最后將重建的圖像輸出:

Sigma = np.zeros((3, 80, 170))

for j in range(3):
    np.fill_diagonal(Sigma[j, :, :], s[j, :])

reconstructed = U @ Sigma @ Vt
print(reconstructed.shape)

plt.imshow(np.transpose(reconstructed, (1, 2, 0)))

當(dāng)然,也可以選擇前面的K個(gè)特征值對(duì)圖像進(jìn)行壓縮:

approx_img = U @ Sigma[..., :k] @ Vt[..., :k, :]
print(approx_img.shape)
plt.imshow(np.transpose(approx_img, (1, 2, 0)))

重新構(gòu)建的圖像如下:

對(duì)比可以發(fā)現(xiàn),雖然損失了部分精度,但是圖像還是可以分辨的。

總結(jié)

圖像的變化會(huì)涉及到很多線性運(yùn)算,大家可以以此文為例,仔細(xì)研究。

到此這篇關(guān)于NumPy實(shí)現(xiàn)多維數(shù)組中的線性代數(shù)的文章就介紹到這了,更多相關(guān)NumPy 多維數(shù)組線性代數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 跟老齊學(xué)Python之有容乃大的list(4)

    跟老齊學(xué)Python之有容乃大的list(4)

    本文是有容乃大的list的第四篇文章,本來(lái)只打算寫(xiě)三篇的,結(jié)果發(fā)現(xiàn)還是有些內(nèi)容沒(méi)有介紹清楚,只好再補(bǔ)一篇了。介紹一下對(duì)list的操作。
    2014-09-09
  • python pprint模塊中print()和pprint()兩者的區(qū)別

    python pprint模塊中print()和pprint()兩者的區(qū)別

    這篇文章主要介紹了python pprint模塊中print()和pprint()兩者的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • PyQt5 PySide2 觸摸測(cè)試功能的實(shí)現(xiàn)代碼

    PyQt5 PySide2 觸摸測(cè)試功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了PyQt5 PySide2 觸摸測(cè)試功能的實(shí)現(xiàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 一篇文章帶你了解Python中的類(lèi)

    一篇文章帶你了解Python中的類(lèi)

    這篇文章主要給大家介紹了關(guān)于Python中類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • python 把文件中的每一行以數(shù)組的元素放入數(shù)組中的方法

    python 把文件中的每一行以數(shù)組的元素放入數(shù)組中的方法

    下面小編就為大家分享一篇python 把文件中的每一行以數(shù)組的元素放入數(shù)組中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python中將zip壓縮包轉(zhuǎn)為gz.tar的方法

    python中將zip壓縮包轉(zhuǎn)為gz.tar的方法

    今天小編就為大家分享一篇python中將zip壓縮包轉(zhuǎn)為gz.tar的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁(yè)面上是否彈出重復(fù)手機(jī)號(hào)碼提示框

    Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁(yè)面上是否彈出重復(fù)手機(jī)號(hào)碼提示框

    這篇文章主要介紹了Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁(yè)面上是否彈出重復(fù)手機(jī)號(hào)碼提示框,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • python-docx文件定位讀取過(guò)程(嘗試替換)

    python-docx文件定位讀取過(guò)程(嘗試替換)

    今天小編就為大家分享一篇python-docx文件定位讀取過(guò)程(嘗試替換),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 深入解析Python中的多進(jìn)程

    深入解析Python中的多進(jìn)程

    這篇文章主要介紹了深入解析Python中的多進(jìn)程,“Python中的多進(jìn)程是通過(guò)multiprocessing包來(lái)實(shí)現(xiàn)的,和多線程的threading.Thread差不多,它可以利用multiprocessing.Process對(duì)象來(lái)創(chuàng)建一個(gè)進(jìn)程對(duì)象
    2022-06-06
  • django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)

    django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)

    這篇文章主要介紹了django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論