Intro
對于同樣的數值計算任務,使用numpy比直接撰寫python代碼實作 優點:
- 代碼更簡潔: numpy直接以陣列、矩陣為粒度計算并且支持大量的數學函式,而python需要用for回圈從底層實作;
- 性能更高效: numpy的陣列存盤效率和輸入輸出計算性能,比python使用list好很多,用numpy進行計算要比原生Python快得多,而且資料量越大,效果越明顯;numpy的大部分代碼都是c語言實作的,這是numpy比python高效的原因
numpy核心:ndarray物件
ndarray物件
- numpy的核心資料結構,叫做array就是陣列,array物件可以是一維陣列,也可以是多維陣列
- python的list也可以實作相同的功能,但是array的優勢在于性能好,包含陣列元資料資訊、大量的便捷函式
- 成為 Scipy、Pandas、scilit-learn、tensorflow、paddlepaddle等框架的通用底層語言
- numpy的array和python的list的一個區別是它的元素必須都是同一種資料型別,這也是numpy高性能的一個原因
ndarray屬性
個人以前會弄混shape和size,注意shape列印的是陣列的形狀是一個元組,size則是表示陣列大小即總共有多少個元素
- shape 回傳一個元組 表示array的形狀
- ndim 回傳一個數字 表示array的維度的數目
- size 回傳一個數字 表示array中所有資料元素的數目
- dtype array中元素的資料型別,
a.astype(str)可以把a陣列元素轉為str型別 - itemsize 表示陣列中每個元素的位元組大小
創建array的方法
- 從Python的串列list和嵌套串列創建array,
np.array([...]) - 使用函式arange、linspace等創建等引陣列,
np.arange(start,stop,step,dtype)左閉右開,np.linspace(start,stop,num,endpoint)默認左右取閉,num是要洗掉的等間隔樣例數量(默認50),endpoint 序列中是否包含stop值, 默認為true - 使用ones、ones_like、zeros、zeros_like、empty、empty_like、full、full_like、eye等函式創建,注意使用empty創建的資料是未初始化的,里面的值可能是隨機值不要用,full則是將一個給定大小的陣列填滿固定值,用法如
np.full((2, 4), 666) - 生成亂數的np.random模塊創建,
np.random.seed(2022)設定隨機種子,使得每次隨機的結果固定,np.random.rand(2,5)隨機生成 2行5列的2維陣列,回傳資料在[0,1)之間;np.random.randint(2,5,5)在[2,5) 范圍內生成5個隨機整數;np.random.uniform(2,5,10)在 [2,5) 之間 生成均勻分布的10個數字;np.random.uniform(2,5,(2,5))在 [2,5) 之間 生成均勻分布的(2,5)個數字;np.random.randn((2,5))則回傳有標準正態分布的資料,均值1方差0;np.random.normal(1,10,(2,5))則可指定均值和標準差;另外,choice從給定的陣列里 生成隨機結果,shuffle把一個陣列進行隨機排列(如果陣列是多維的 則只會在第一維度打散資料),permutation把一個陣列進行隨機排列 ,或者數字的全排列,兩者功能相同但permutation不會更改原來的arr 會回傳一個新的copy
numpy的陣列索引
三種索引方法:
- 基礎索引,切片法,不詳細敘述
- 神奇索引,就是用整數陣列進行的索引,比如對于x = np.arange(10),可以用
x[np.array([[0,2],[1,3]])]來取x對應位置的值;對于二維陣列,Y[:,[0, 2]]篩選第0和第2列,Y[[0,2,3],[1,2,3]]同時指定行列 - 布爾索引,對于x = np.arange(10),可以用x>5回傳bool值的陣列,
x[x>5] = 1通過條件進行賦值,把x中大于5的值全部賦為1,x[x<5] += 20,小于5的值全部加20,還可以進行條件組合,比如x[(x%2==0)| (x>7)]和x[(x%2==0)& (x>7)];注意對于二維陣列Y = np.arange(20).reshape(4, 5) 來說,既有行又有列 因此回傳的是 行列一維陣列Y[Y>5]回傳的是行列一維陣列,可以用Y[:, 3][Y[:, 3]>5]把第3列大于5的行資料篩選出來
numpy資料操作
陣列數學操作
A*B是對應位置元素相乘,對于arr = np.arange(12).reshape(3,4),可以用各種數學統計函式,包括sum,prod(元素乘積),cumsum(np.cumsum(arr)從頭到尾累加,每加一次輸出一個元素),cumprod(累積),min,max,median,mean,np.percentile(arr,[25,50,75])和np.quantile(arr,[0.25,0.5,0.75])求取數列第?分位的數值(后者范圍為0-1),std(標準差)
,var(方差),np.average(arr, weights=np.random.rand(*arr.shape)) 加權平均,argmax 尋找最大值的下標
- 對于numpy的聚合類函式的axis引數解釋:axis=0代表行 axis=1 代表列,axis=0 代表把行消解掉,axis=1 代表把列消解掉;axis=0 代表跨行計算, axis=1 代表跨列計算
陣列合并操作
對于a = np.arange(9).reshape(3,3)以及b = np.arange(9,18).reshape(3,3),合并行(行變多)使用np.concatenate([a,b])或np.vstack([a,b])或np.row_stack([a,b]) ,合并列(列變多)使用np.concatenate([a,b],axis=1)或np.hstack([a,b])或np.column_stack([a,b]),
參考
[1-5 Numpy教程 — 梗直哥隨筆 v0.1 檔案 (gengzhige-essay.readthedocs.io)](https://gengzhige-essay.readthedocs.io/docs/01 環境配置/1-5 Numpy教程.html)
科學計算庫Numpy - mathor (wmathor.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499748.html
標籤:其他
下一篇:java學習第二天
