您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“NumPy中掩碼數(shù)組怎么創(chuàng)建”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“NumPy中掩碼數(shù)組怎么創(chuàng)建”吧!
numpy.ma子模塊通過引入掩碼數(shù)組提供了一種解決數(shù)據(jù)缺失或無效問題的安全、便捷的方法。numpy.ma子模塊的主體是MaskedArray類,他是numpy.ndarray的派生類,可以把numpy.ma子模塊當(dāng)做ndarray來用,且無須考慮數(shù)組的無效值是否會給操作帶來無法預(yù)制的意外
import numpy as np import numpy.ma as ma
掩碼數(shù)組子模塊的ma.array()函數(shù)和Numpy的np.array()函數(shù)類似,可以直接將列表生成掩碼數(shù)組,默認(rèn)mask參數(shù)為False,生成的數(shù)組類型是MaskedArray類。數(shù)組掩碼梳理后,無論是查找最大值、最小值,還是計算均值、方差,都不用再擔(dān)心數(shù)據(jù)是否無效的問題了
import numpy as np import numpy.ma as ma a = ma.array([0, 1, 2, 3], mask=[0, 0, 1, 0]) # 指定第3個元素?zé)o效 print(a) print(type(a)) print(a.min(), a.max(), a.mean(), a.var())
ma.asarray()函數(shù)可以將普通的NumPy數(shù)組轉(zhuǎn)成掩碼數(shù)組。新生成的掩碼數(shù)組不會對原數(shù)組中的np.nan或np.inf做掩碼處理,但是會相應(yīng)調(diào)整填充值(fill_value)
import numpy as np import numpy.ma as ma a = np.arange(5) print(ma.asarray(a)) a = np.array([1, np.nan, 2, np.inf, 3]) # 包含特殊值的數(shù)組 print(ma.asarray(a))
ma.asarray()函數(shù)不會對原數(shù)組中的np.nan或np.inf做掩碼處理,ma.masked_invalid()函數(shù)則可以實現(xiàn)這個功能
import numpy as np import numpy.ma as ma a = np.array([1, np.nan, 2, np.inf, 3]) print(ma.masked_invalid(a))
有時需要將數(shù)組中的某個給定值設(shè)置為無效(掩碼),ma.masked_equal()函數(shù)可以實現(xiàn)這個功能
import numpy as np import numpy.ma as ma a = np.arange(3).repeat(2) print(ma.masked_equal(a, 1)) # 對數(shù)組元素1做掩碼
有時需要將數(shù)組中符合條件的某些特定值設(shè)置為無效(掩碼),掩碼數(shù)組子模塊提供了若干函數(shù)實現(xiàn)條件掩碼。這些可能的篩選條件包括大于、大于等于、小于、小于等于、區(qū)間內(nèi)、區(qū)間外等6中。
import numpy as np import numpy.ma as ma a = np.arange(8) print(ma.masked_greater(a, 4)) # 掩碼大于4的元素 print(ma.masked_greater_equal(a, 4)) # 掩碼大于等于4的元素 print( ma.masked_less(a, 4)) # 掩碼小于4的元素 print(ma.masked_less_equal(a, 4)) # 掩碼小于等于4的元素 print(ma.masked_inside(a, 2, 5)) # 掩碼 [2,5]之間的元素 print(ma.masked_outside(a, 2, 5)) # 掩碼 [2,5]之外的元素
a和b是兩個結(jié)構(gòu)相同的數(shù)組,如果用a>5的條件對數(shù)組b掩碼,上面那些函數(shù)就失效了。這種情況可以使用ma.masked_where()函數(shù),該函數(shù)也可以對數(shù)組自身掩碼
import numpy as np import numpy.ma as ma a = np.arange(8) b = np.random.random(8) print( ma.masked_where(a>5, b)) # 用a>5的條件掩碼數(shù)組b
因為掩碼數(shù)組MaskedArray類是numpy.ndarray的派生類,所以那些用在普通NumPy數(shù)組上的索引和切片操作也依然有效
import numpy as np import numpy.ma as ma a = np.array([1, np.nan, 2, np.inf, 3]) a = ma.masked_invalid(a) print(a[0], a[1], a[-1]) print(a[1:-1])
掩碼數(shù)組內(nèi)置方法的使用和普通數(shù)組沒有區(qū)別。使用NumPy命名空間的函數(shù)則要慎重,如果掩碼數(shù)組子模塊有對應(yīng)函數(shù),應(yīng)優(yōu)先使用數(shù)組子模塊的對應(yīng)函數(shù)。例如,對掩碼數(shù)組求正弦,如果使用np.sin()函數(shù),會發(fā)出警告信息;如果使用ma.sin()函數(shù),則無任何問題
import numpy as np import numpy.ma as ma a = np.array([1, np.nan, 2, np.inf, 3]) a = ma.masked_invalid(a) print(a.min(), a.max(), a.mean(), a.var()) #print(np.sin(a)) # 雖然可以執(zhí)行,但會彈出警告 print(ma.sin(a)) # 這才是正確的用法
任何情況下,我們都可以通過掩碼數(shù)組的data屬性來獲得掩碼數(shù)組的數(shù)據(jù)視圖,其類型就是np.ndarray數(shù)組。另外,還可以使用掩碼數(shù)組的__array__()函數(shù)或ma.getdata()函數(shù)來獲取掩碼數(shù)組的數(shù)據(jù)視圖。上述三種方法獲得數(shù)據(jù)視圖的操作,本質(zhì)上都是操作掩碼的數(shù)組本身。如果需要數(shù)據(jù)視圖副本,需使用copy()函數(shù)
import numpy as np import numpy.ma as ma a = ma.array([1, np.nan, 2, np.inf, 3]) print(a) x = a.data y = a.__array__() z = ma.getdata(a) w = np.copy(a.__array__()) # 復(fù)制數(shù)據(jù)視圖 print(x) print(y) print(z) print(w) a[-1] = 9 print(x) print(y) print(z) print(w)
通過掩碼數(shù)組的mask屬性可以查看當(dāng)前數(shù)組的掩碼情況,其代碼如下。通常,數(shù)組的掩碼是一個布爾型數(shù)組,或是一個布爾值
import numpy as np import numpy.ma as ma a = ma.masked_invalid(np.array([1, np.nan, 2, np.inf, 3])) print(a.mask)
如果要對數(shù)組切片掩碼或?qū)?shù)組的某個元素掩碼,直接令該切片或該元素等于ma.masked常量即可
import numpy as np import numpy.ma as ma a = ma.masked_invalid(np.array([1, np.nan, 2, np.inf, 3])) print(a.mask) print(a) a[:2] = ma.masked print(a)
如果要撤銷對數(shù)組切片或數(shù)組中的某個元素的掩碼,只需要對該切片或該元素做賦值操作即可
import numpy as np import numpy.ma as ma a = ma.masked_invalid(np.array([1, np.nan, 2, np.inf, 3])) a[1] = 1.5 a[2:4] = 5 print(a)
到此,相信大家對“NumPy中掩碼數(shù)組怎么創(chuàng)建”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。