您好,登錄后才能下訂單哦!
NumPy基礎:數組與向量化計算
安裝numpy及使用
pip install numpy
PyCharm無法使用numpy
File-->setting-->項目名-->Project Interpreter-->本地安裝python-->應用
測試代碼
import numpy as npdata = np.random.randn(2,3)print(data)
numpy簡介
作用
ndarry,一種高效多維數組,提供了基于數組的邊界算術操作及靈活的廣播功能
對所有數據進行快速的矩陣計算,而無需編寫循環程序
對硬盤中數組數據進行讀寫的工具,并對內存映射文件進行操作
線性代數、隨機數生成以及傅里葉變換功能
用于連接NumPy到C、C++和FORTRAN語言類庫的C語言API
數據分析應用
在數據處理。清洗、構造子集、過濾、變換以及其他計算中進行快速的向量化計算。
常見的數組算法,比如sort、unique以及set操作等
高效的描述性統計和聚合/概述數據
數據排列和相關數據操作,例如對異構數據進行merge和join
使用數組表達式來表明條件邏輯,代替if-elif-else條件分支的循環
分組數據操作(聚合、變換以及函數式操作)
python數組計算歷程
Python中的數組計算方式要追溯到1995年,當時Jim Hugunin創造Numeric庫。之后10年里,許多科研編制社區開始利用Python進行數組編程,但類庫的生態在2000年之后都是碎片化的。2005年,Travis Oliphant在Numeric和Numarray項目之上打造了NumPy,將社區整合到用一個數組計算框架下。
NumPy重要原因
NumPy在內部將數據存儲在連續的內存塊上,這與其他的Python內建數據結構是不同的。NumPy的算法庫是用C語言寫的,所以在操作數據內存時不需要任何類型檢查或者其他管理操作。NumPy數組使用的內存量也小于其他Pyhon內建序列。
Numpy可以針對全量數組進行復雜計算而不需要寫Python循環。
性能對比代碼
# NumPy性能和Python常規對比start = time.time()my_arr = np.arange(1000000)my_arr = my_arr * 2end = time.time()print('Running time: %s Seconds'%(end-start))start = time.time()my_list = list(range(1000000))my_list = my_list * 2end = time.time()print('Running time: %s Seconds' % (end - start))
NumPy ndarray:多維數組對象
ndarray
NumPy的核心特征之一就是N-維數組對象--ndarray。ndarray是Python中一個快速、靈活的大型數據集容器。數組允許你使用類似于標量的操作語法在整塊數據上進行數學計算。
一個ndarray是一個通用的多維同類數據容器,也就是說,他包含的每一個元素均為相同類型。每一個數組都有一個shape屬性,用來表征數組每一維度的數量;每一個數組都有一個dtype屬性,用來描述數組的數據類型。
生成ndarray
生成數組最簡單的方式就是使用array函數。array函數接收任意的序列型對象(當然也包括其他的數組),生成一個新的包含傳遞數據的NumPy數組。
屬性
ndim 數組緯度
shape 數組緯度和數量
dtype 數組類型
數組生成函數
array 將輸入數據(可以是列表、元組、數組以及其他序列)轉換為ndarray,如不顯式指明數據類型,將自動判斷;默認復制所有的輸入數據。
asarray 將輸入轉換為ndarray,但如果輸入已經是ndarray則不再復制
arange Python內建函數range的數組版,返回一個數組
ones 根據給定形狀和數據類型生成全1數組
ones_like 根據所誒數組生成一個形狀一樣的全1數組
zeros 根據給定形狀和數據類型生成全0數組
zeros_like 根據所給的數組生成一個形狀一樣的全0數組
empty 根據給定形狀生成一個沒有初始化數值的空數組
empty_like 根據所給數組生成一個形狀一樣但沒有初始化數值的空數組
full 根據給定的形狀和數據類型生成指定數值的數組
full_like 根據所給的數組生成一個形狀一樣但內容是指定數值的數組
eye,identity 生成一個N*N特征矩陣(對角線位置都是1,其余位置都是0)
使用np.empty 來生成一個全0數組,并不安全,有些時候他可能會返回未初始化的垃圾數值
ndarray數據類型
數據類型即dtype,是一個特殊的對象,他包含了ndarray需要為某一種類型數據所申明的內存塊信息(也稱為元數據,即表示數據的數據)
通常不需要擔心如何記住NumPy數據類型,尤其當你還是新手的時候。通常你只需要關系數據的大類,比如浮點型、整數、布爾值、字符串或者某個Python對象。當你需要在內存或者硬盤上做更深入的存取操作時,尤其大數據集時,你才真正需要了解存儲的數據類型。
數據類型
int8,uint8 類型代碼il,ul 有符號和無符號的8數位整數
int16,uint16 類型代碼i2,u2 有符號和無符號的16數位整數
int32,uint32 類型代碼i4,u4 有符號和無符號的32數位整數
int64,uint64 類型代碼i8,u8 有符號和無符號的64數位整數
float16 類型代碼f2 半精度浮點數
float32 類型代碼f4或f 標準單精度浮點數;兼容C語言float
float64 類型代碼f8或d 標準雙精度浮點數;兼容C語言double和Python float
float128 類型代碼f16或g 拓展精度浮點數
complex64,complex128,complex256 類型代碼c8,c16,c32 分別基于32位、64位、128位浮點數的復數
bool 類型代碼? 布爾值,存儲True或False
object 類型代碼O Python object類型
string_ 類型代碼S 修正的ASC II 字符串類型;例如生成一個長度為10的字符串類型使用S10
unicode_ 類型代碼U 修改的Unicode類型,生成一個長度為10的Unicode類型使用U10
浮點數轉換成整數則小數點后的部分將被消除
在NumPy中,當使用numpy.string_類型作字符串數據要小心,因為NumPy會修正他的大小或者刪除輸入切不發出警告。pandas在處理非數值數據時有更直觀的開廂型操作
使用astype時總生成一個新的數組,即使你傳入的dtype與之前一樣
NumPy數組算術
數組之所以重要是因為他允許你進行批量操作而無需任何for循環,NumPy用戶稱這種特性為向量化
帶有標量計算的算術操作,會把計算參數傳遞給數組的每個元素
同尺寸數組之間的比較,會產生一個布爾值數組
不同尺寸的數組間的操作,將會用到廣播特性,將會在附錄A中介紹。
基礎索引與切片
數組切片是原數組的視圖,意味著數據并不是被復制了任何對于視圖的修改都會反應在原數組上
如果你還是想要一份數組切片的拷貝而不是一份視圖的話,你就必須顯式地復制這個數組。arr[5:8].copy()
在一個二維數組中,每個索引值對應的元素不是一個值而是一個一維數組。
在多維數組中,你可以省略后續索引值,返回對象將是降低一個維度的數組
數組切片索引
數組延著軸0進行切片,表達式arr[:2]的含義為選擇arr的前兩行
如果將索引和切片混合,就可以得到維度的切片
注意:單獨一個冒號標識選擇整個軸上的數組
arr[:2, 1:] 從開始到第二行,從第一列到最后一列
arr[2] 第三行數據
arr[2,:] 第三行數據
arr[2:,:] 第三行數據
arr[:,:2] 所有行數據和首列到第二列
布爾索引
布爾值數組的長度和數組軸索引長度一致。你甚至還可以用切片或者整數值對布爾值數組進行混合匹配
當布爾值數組的長度不正確時,布爾值選擇數據的方法并不會報錯,因此建議在使用該特性要注意
為了選擇除條件以外的其他數據,你可以使用!=或者在條件表達式前使用~對條件取反
使用布爾值索引選擇數據時,總是生成數據的拷貝,即使返回的數組并沒有任何變化。
Python中的關鍵字and或or對布爾值數據并沒有用,要使用&(and)和|(or)來代替
神奇索引
神奇索引時NumPy中的術語,用于描述使用整數數組進行數據索引。
神奇搜索與切片不同,他總是將數據復制到一個新的數組中。
正數數組從前索引,負數數組從后索引
數組轉置和換軸
轉置是一種特殊的數據重組形式,可以返回底層數據的視圖而不需要復制任何內容。數組擁有transpose方法,也有特殊的T屬性。
T屬性就是數據反轉
計算矩陣內積會使用np.dot
對于更高維度數組,transpose方法可以接收包含軸編號的元組,用于置換軸。
使用.T進行轉置是換軸的一個特殊案例,ndarray有一個swapaxes方法,該方法接收一個對軸編號作為參數,并對軸進行調整用于重組數據
swapaxes返回的是數據視圖,而沒有對數據進行復制
通用函數:快速的逐元素數組函數
含義
通用函數,也可以稱為ufunc,是一種ndarray數據中進行逐元素操作的函數。
某些簡單函數接收一個或者多個標量數值,并產生一個或者多個標量結果,而通過函數就是對這些簡單函數的向量化封裝
一元通用函數
abs、fabs 逐元素地計算整數、浮點數或者復數的絕對值
sqrt 計算每個元素的平方根(與arr ** 0.5相等)
square 計算每個元素的平方(與arr ** 2相等)
exp 計算每個元素的自然數指數值ex
log、log10、log2、log1p 分別對應:自然數對數(e為底)、對數10位底、對數2為底、log(1+x)
sign 計算每個元素的符號值:1(整數)、0(0)、-1(負數)
ceil 計算每個元素的最高整數值(即大于等于給定數值的最小整數)
floor 計算每個元素的最小整數值(即小于等于給定元素的最大整數)
rint 將元素保留整數位,并保持dtype
modf 分別將數組的小數部分和整數部分按數組形式返回
isnan 返回數組中的元素是否是一個NaN(不是一個數值),形式為布爾值數組
isfinite、isinf 分別返回數組中的元素是否有限(非inf、非NaN)、是否無線的,形式為布爾值數組
cos、cosh、sin、sinh、tan、tanh 常規的雙曲三角函數
arccos、arccosh、arcsin、arcsinh、arctan、arctanh 反三角函數
logical_not 對數組的元素按位取反(與~arr效果一致)
二元通用函數
add 將數組的對應元素相加
subtract 在第二個數組中,將第一個數組中包含的元素去除
multiply 將數組的對應元素相乘
divide、floor_divide 除或者整除(放棄余數)
power 將第二個數組的元素作為第一個數組對應元素的冪次方
maximum、fmax 逐個元素計算最大值,fmax忽略NaN
minmum、fmin 逐個元素計算最小值,fmin忽略NaN
mod 按元素的求摸計算(即求除法的余數)
copysign 將第一個數組的符號值改為第二個數組的符號值
greater、greater_equal、less、less_equal、equal、not_equal 進行逐個元素的比較,返回布爾值數組(與數學操作符>、>=、<、<=、==、!=效果一致)
logical_and、logical_or、logical_xor 進行逐個元素的邏輯操作(與邏輯操作符&、|、^效果一致)
使用數組進行面向數組編程
含義
使用NumPy數組可以使你利用簡單的數組表達式完成多種數據操作任務,而無需寫些大量循環。這種利用數組表達式來替代顯式循環的方法稱為向量化
向量化的數組操作會比純Python的等價實現在速度上快一到兩個數量級(甚至更多),這對多有種類的數值計算產生了最大的影響
將條件邏輯作為數組操作
numpy.where函數是三元表達式 x if condition else y的向量化版本
np.where 的第一個參數是條件,第二個和第三個參數并不一定是數組可以是標量
where在數據分析中一個典型的用法是根據一個數組來生成一個新的數組
傳遞給np.where的數組即可以是同等大小的數組,也可以是標量
數學和統計方法
許多關于計算整個數組統計值或者關于軸向數據的數學函數,可以作為數組類型的方法被調用。你可以使用聚合函數(通常也叫縮減函數),比如sum、mean和std(標準差),即可以直接調用數組實例的方法,也可以使用頂層的NumPy函數。
基礎數組統計方法
sum 沿著軸向計算所有元素的累和,0長度的數組,累和為0
mean 數學平均,0長度的數組平均值為NaN
std、var 標準差和方差,可以選擇自由度調整(默認分母n)
min、max 最小值和最大值
armin、armax 最小值和最大值的位置
cumsum 從0開始元素累積和
cumprod 從1開始元素累積積
布爾值數組的方法
布爾值會被強制為1(True)和0(False)。
可以通過sum用于計算布爾值數組中True的個數
any檢查數組中是否至少有一個True
all檢查是否每個值都是True
排序鄭州人流醫院 http://m.zzzy120.com/
和Python的內建列表類型相似,NumPy數組可以使用sort方法按位置排序。
在多維數組中根據傳遞的axis值,沿著軸向對每個一維數據段進行排序
頂層的np.sort方法返回的是已經排序號的數組拷貝,而不是對原數組按位置排序
唯一值與其他集合邏輯
NumPy包含一些針對一維ndarray的基礎集合操作。
數組集合操作
unique(x) 計算x的唯一值并排序
intersect1d(x,y) 計算x和y的交集,并排序
union1d(x,y) 計算x和y的并集,并排序
inld(x,y) 計算x中的元素是否包含在y中,返回一個布爾值數組
setdiff1d(x,y) 差集,在x中但不在y中的x元素
setxor1d(x,y) 異或集,在x或y中,但不屬于x、y交集的元素
使用數組進行文件輸入和輸出
NumPy可以在硬盤中將數據以文本或者二進制文件的形式進行存入銀盤或者由硬盤載入。
大部分用戶更傾向于與使用pandas或者其他工具來載入文本或者表格型數據
np.save和np.load是高效存取硬盤數據的兩大工具函數。數組在默認情況下是以未壓縮的格式進行存儲的,后綴名.npy
壓縮好的數據可能會想要使用numpy.savez_compressed將數據存入已經壓縮的文件中
線性代數
線性代數比如矩陣乘法、分解、行列式等方陣數學,是所有數組類庫的重要組成部分
NumPy的線性代數中所不同的是 * 是矩陣的逐元素乘積而不是矩陣的點乘積,因此NumPy的數組方法和numpy命名空間中都有一個函數dot
numpy.linalg 擁有一個矩陣分解標準的函數集,以及其他常用函數。
數組.T.dot(數組) 計算的是數組和它的轉置矩陣數組.T的點乘積
特殊符號@也作為中綴操作符,用于點乘矩陣操作
常用numpy.linalg函數
diag 講一個方陣的對角(或非對角)元素作為一維數組返回,或者將一維數組換成一個方陣,并且在非對角線上又零點
dot 矩陣點乘
trace 計算對角元素和
eig 計算方陣的特征值和特征向量
inv 計算方陣的逆矩陣
pinv 計算矩陣的Moore-Penrose偽逆
qr 計算QR分解
svd 計算奇異值分解(SVD)
solve 求解x的線性系統Ax = b ,其中A是方陣
lstsq 計算Ax = b 的最小二乘解
偽隨機數生成
numpy.random模塊填補了Python內建在random模塊的不足,可以高效地生成多種概率分布下的完整樣本值數組
Python內建random模塊一次中能生成一個值
偽隨機數他們是由具有確定性行為的算法根據隨機數生成器中的隨機數種子生成,可以通過np.random.seed更改NumPy的隨機數種子
numpy.random中的數據生成函數使用一個全局隨機數種子。為了避免全局狀態,你可以使用numpy.random.RandomState創建一個隨機數生成器,使數據獨立于其他的隨機數狀態
numpy.random中的部分函數
seed 向隨機數生成器傳遞隨機狀態種子
permutation 返回一個序列的隨機排列,或者返回一個亂序的整數范圍序列
shuffle 隨機排列一個序列
rand 從均勻分布中抽取樣本
randint 根據給定的由低到高的范圍抽取隨機整數
randn 從均值0方差1的正態分布中抽取樣本(MATLAB型接口)
binomial 從二項分布中抽取樣本
normal 從正態(高斯)分布中抽取樣本
beta 從beta分布中抽取樣本
chisquare 從卡方分布中抽取樣本
gamma 從伽馬分布中抽取樣本
uniform 從均勻[0,1)分布中抽取樣本
示例:隨機漫步
隨機漫步模型提供了一個適用數組操作的說明性應用
一次性模擬多次隨機漫步
# 模擬多次隨機漫步,比如說5000步,如果傳入一個2個元素的元組# numpy.random中的函數可以生成一個二維抽取數組,并且我們可# 以一次性地跨行計算出全部5000個隨機不的累積和n = 5000ns = 1000d = np.random.randint(0,2,size=(n,ns))s = np.where( d > 0,1,-1)w = s.cumsum(1)print(w)# 現在我們可以計算出這些隨機步的最大值和最小值print(w.max())print(w.min())# 讓我們在這些隨機步中計算出30或者-30的最小穿越時間。這有點辣手# 因為我們不是所有的5000都達到了30.我們可以使用any方法來檢查hi30 = (np.abs(w) >= 30).any(1)print(hi30)print(hi30.sum())# 我們可以使用布爾值數組來選出絕對不輸超過30的步所在的行,并使用# argmax從軸向1上獲取時間c_time = (np.abs(w[hi30]) >= 30).argmax(1)print(c_time.mean())
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。