【Python】Numpy基础:数组和矢量运算
生活随笔
收集整理的這篇文章主要介紹了
【Python】Numpy基础:数组和矢量运算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Numpy基礎:數組和矢量運算
目錄:
文章目錄
- 一 Numpy及其重要性
- 二 ndarray:一種多維數組對象
- 1 創建ndarray
- 2 ndarray的數據類型
- 3 數組和標量之間的運算
- 4 基本的索引和切片
- ① 元素索引
- ② 切片索引
- ③ 布爾型索引
- ④ 花式索引
- ⑤ 數組轉置和軸對換
- 三 通用函數:快速的元素級數組函數
- 四 利用數組進行數據處理
- 1 將條件邏輯表述為數組計算
- 2 數學與統計方法
- 3 用于布爾型數組的方法
- 4 排序
- 5 唯一化及其他的集合邏輯
- 五 用于數組的文件輸入輸出
- 六 線性代數
- 七 隨機數生成
一 Numpy及其重要性
- Numpy(Numerical Python)是高性能科學計算和數據分析的基礎包,它是幾乎所有數據分析高級工具的構建基礎。
① ndarray ,一個具有矢量算數運算和復雜廣播能力的快速且節省空間的多維數組。
② 用于對整組數據進行快速運算的標準數學函數(無需編寫循環)。
③ 用于讀寫磁盤數據的工具以及用于操作內存映射文件的工具。
④ 線性代數、隨機數生成及傅里葉變換功能。
⑤ 用于集成由C,C++,Fortran等語言編寫的代碼的工具CAPI,將數據傳遞給外部庫(生態系統角度)。
⑥ Numpy本身并沒有提供多么高級的數據分析功能,理解Numpy數組以及面向數組的計算將有助于你更加高效地使用pandas等工具。精通面向數組的編程和思維方式是成為Python科學計算牛人的一大關鍵步驟。
- 對于大部分數據分析應用而言,最關注的功能主要集中于:
① 用于數據整理、自己構建、過濾、轉換等快速的矢量化數組運算。
② 常用的數組算法,如排序、唯一化、集合運算等。
③ 高效的描述統計和數據聚合/摘要運算。
④ 用于異構數據集的合并/連接運算的數據對齊和關系型數據運算。
⑤ 將條件邏輯表述為數組表達式(而不是帶有if-elif-else分支的循環)。
⑥ 數據的分組運算(聚合、轉換、函數應用等)。
二 ndarray:一種多維數組對象
- Numpy最重要的一個特點就是其N維數組對象:ndarray,該對象是一個快速而靈活的大數據集容器。可以利用這種數組對整塊數據執行一些數學運算,其語法與標量元素之間的運算一樣。
- ndarray是一個通用的同構數據多維容器,其中所有的元素必須是相同類型的。每個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用于說明數據類型的對象)。
1 創建ndarray
- 序列型的對象
- 嵌套序列,嵌套序列將會被轉換為一個多維數組。
- np.array會嘗試為新建的數組推斷出一個較為合適的數據類型,數據類型保存在一個特殊的dtype對象中。
- 其他的創建數組的函數。
2 ndarray的數據類型
- dtype(數據類型)是一個特殊的對象,它含有ndarray將一塊內存解釋為特定數據類型所需的信息:
- dtype是Numpy如此強大和靈活的原因之一。
- Numpy的數據類型:
- int8/uint8——有符號和無符號
- float64——浮點型
- complex64——復數
- bool——布爾型
- object——python對象類型
- string_——字符串類型
- unicode——unicode類型
- 可以通過ndarray的astype方法顯式地轉換其dtype
- 調用astype無論如何都會創建出一個新的數組(原始數據的一份拷貝),即使新dtype跟以前的一樣
3 數組和標量之間的運算
- 數組很重要,因為它使你不用編寫循環即可對數據執行批量運算。這通常就叫做矢量化。
- 大小相等的任何算術運算都會將運算應用到元素級。
- 數組與標量的算術運算也會將那個標量值傳播到各個元素。
- 不同大小的數組之間的運算叫做廣播(廣播機制)。
4 基本的索引和切片
- Numpy數組的索引是一個內容豐富的主題,因為選取數據子集或單個元素的方式有很多。
- 將一個標量值賦值給一個切片時,該值會自動廣播到整個選區。
- 跟列表最重要的區別在于,數組切片是原始數組的視圖,這意味著數據不會被復制,視圖上的任何修改都會直接反映到源數據上。如果需要一份副本而非本視圖,則需要顯式復制操作:arr.copy()。
- Numpy的設計目的是處理大數據。Numpy將數據來回復制的話將會產生很多性能和內存問題。
① 元素索引
- 對于高維度數組,能做的事情更多。在一個二維數組中,各索引位置上的元素不再是標量,而是一維數組。
- 可以對高維數組各個元素進行遞歸訪問,也可以傳入一個逗號隔開的索引列表來選取單個元素。
② 切片索引
- nadrray的切片語法跟python列表這樣的一維對象差不多。
- 高緯度對象的切片花樣比較多。可以在一個軸或者多個軸上進行切片,也可以跟整數索引混合使用。
③ 布爾型索引
- 判斷滿足條件
④ 花式索引
- 花式索引是一個Numpy術語,它指的是利用整數數組進行索引
⑤ 數組轉置和軸對換
- 轉置(transpose)是重塑的一種特殊形式,它返回的是源數據的視圖(不會進行任何復制操作)
- T屬性。進行矩陣計算時,經常需要用到該操作。
三 通用函數:快速的元素級數組函數
- 通用函數(ufunc)是一種對nadrray中的數據執行元素級運算的函數。可以將其看做簡單函數(接受一個或多個標量值,并產生一個 或多個標量值)的 矢量化包裝器。
- 許多ufunc都是簡單的元素級變體。如np.sqrt() /np.exp()
- 一元ufunc(接受一個數組):
- abs/fabs #絕對值 ,非負數的絕對值。
- sqrt #計算各元素平方根。
- square #計算各元素平方。
- exp #計算各元素指數。
- log/log10/log2/log1p #計算各元素的自然對數。
- sign #計算各元素的正負號。
- ceil #計算各元素的ceiling值,即大于等于該值的最小整數。
- floor #計算各元素的floor值,即小于等于該值的最大整數。
- rint #將各元素四舍五入到最接近的整數。
- modf #將數組的小數和整數部分以兩個獨立數組的形式返回。
- isnan #返回一個表示“哪些值是NaN”的布爾型數組。
- isfinite/isinf #返回表示無窮的布爾型數組。
- cos/cosh/sin/sinh/tan/tanh #三角函數
- 二元ufunc(接受兩個數組):
- add #將數組中對應的元素相加
- subtract #從第一個數組中減去第二個數組中的元素。
- multiply #數組元素相乘。
- divide/floor_divide #除法或向下圓整除法,丟棄余數。
- power #計算第二個數組元素b相對于第一個數組中元素a的計算:a的b次方。
- maximum/fmax #元素級的最大值計算,忽略NaN。
- minimum/fmin #元素級的最小值計算,忽略NaN。
- copysign #將第二個數組的值得符號復制給第一個數組中對應的值。
- greater/greater_equal/less/less_equal/equal/not_equal #執行元素級的比較運算,最終產生布爾型數組。
- logical_and/logical_or/logical_xor #執行元素級的真值邏輯運算 (與或非)。
四 利用數組進行數據處理
- Numpy數組可以將許多種數據處理任務表述為簡潔的數組表達式(否則需要編寫循環)。
- 用數組表達式代替循環的做法,通常被稱作矢量化。一般來說,矢量化數組運算比等價的純python方法快1~2個數量級(甚至更多)。
- 廣播——是一種針對矢量化計算的強大手段。
1 將條件邏輯表述為數組計算
- 在數據分析中,where通常用于根據一個數組而產生一個新的數組。
- np.where函數是三元表達式x if condition else y 的矢量化版本。
- np.where的第二個和第三個參數不必是數組,傳遞給where的數組大小可以不相等,甚至可以是標量值。
- 多層嵌套使用,功能更加強大。
2 數學與統計方法
- 可以通過數組上的一組數學函數對整個數組或某個軸向的數據進行統計計算、聚合運算(aggregation 通常叫做約簡)。
- 基本數組統計方法:
- sum #對數組中全部或者軸向的元素求和。
- mean #算術平均數
- std/var #分別為標準差和方差,自由度可調
- min/max #最大值和最小值
- argmin/argmax #最大和最小元素的索引
- cumsum #累計和
- cumprod #累計積
- sum和mean等函數可以接受一個axis參數,用于計算軸向的統計值,得到一個少一維的數組。
- cumsum、cumprod之類的方法不聚合,產生一個由中間結果組成的數組。
3 用于布爾型數組的方法
4 排序
- 跟python一樣,Numpy數組也可以通過sort方法就地排序。
- 多維數組可以在任意一個軸上進行排序,只要給出軸編號傳給sort即可。
- 頂級方法返回的是數組的已排序副本,而就地排序會修改數組本身。
- 計算數組分位數最簡單的方法是對齊進行排序,然后選取特定位置的值。
5 唯一化及其他的集合邏輯
- Numpy提供了一些針對一維ndarray的基本集合運算。
- 數組的集合運算:
- unique(x) #計算x中的唯一元素,并返回有序結果。等價于純python代碼中的set()。
- intersect1d(x,y) #計算x和y中的公共元素,并返回有序結果。
- union1d(x,y) #計算x和y的并集,并返回有序結果。
- in1d(x,y) #得到一個表示“x是否包含于y”的布爾型數組。
- setdiff1d(x,y) #集合的差,即元素在x中且不在y中。
- setxor1d(x,y) #集合的對稱差,即存在于一個數組中但不同時存在于兩個數組中的元素。
五 用于數組的文件輸入輸出
- Numpy可以讀寫磁盤上的文本數據或者二進制數據
- np.save和np.load是讀寫磁盤數組數據的兩個主要函數
六 線性代數
-
線性代數(如矩陣乘法、矩陣分解、行列式及其他方陣數學等)是任何數據庫的重要組成部分。
-
Numpy.ligalg中有一組標準的矩陣分解運算以及諸如求逆合行列式之類的東西:
- diag #以一維數組的形式返回方陣的對角線(或非對角線)元素,或將一維數組轉換為方陣(非對角線元素為0)。
- dot #矩陣乘法。
- trace #計算對角線元素的和。
- det #計算矩陣行列式。
- eig #計算方陣的本征值和本征向量。
- inv #計算方陣的逆。
- pinv #計算矩陣的MP偽逆。
- qr #計算QR分解。
- svd #計算奇異值分解(SVD)。
- solve #解線性方程組ax = b,其中a為一個方陣。
- lstsq #計算ax = b的最小二乘解。
七 隨機數生成
- Numpy.random模塊對python內置的random進行了補充,增加了一些用于高效生成多種概率分布的樣本值函數。而python內置的random模塊則只能一次生成一個樣本值,且需要生成在大量樣本值時,Numpy.random快了不止一個量級。
- 部分Numpy.random函數:
- seed #確定隨機數生成器的種子。
- permutation #返回一個序列的隨機排列或返回一個隨機排列的范圍。
- shuffle #對一個序列就地隨機排列。
- rand #產生均勻分布的樣本值。
- randint #從給定的上下限范圍內隨機選取整數。
- randn #產生正態分布(平均值為0,標準差為1)的樣本值。
- binomial #產生二項分布的樣本值。
- normal #產生正態(高斯)分布的樣本值。
- beta #產生beta分布的樣本值。
- chisquare #產生卡方分布的樣本值。
- gamma #產生gamma分布的樣本值。
- uniform #產生在[0,1]中 均勻分布的樣本值。
- 隨機漫步
- 通過模擬隨機漫步來說明如何而運用數組運算。
- 首次穿越時間。
- 一次模擬多個隨機漫步。
總結
以上是生活随笔為你收集整理的【Python】Numpy基础:数组和矢量运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【项目实战】运营商数据信息的特征挖掘(调
- 下一篇: 【Python】Pandas基础:结构化