目錄
一、前言
二、為什么是Numpy?
?
三、科學計算庫(Numpy)基礎
3.0 list or ndarray?
3.1 先創建一個ndarray陣列
(1)由 串列&元組 生成
(2)由Numpy中的普通函式創建(arange、ones、zeros等)
(3)由Numpy中的隨機函式創建(random.rand)
3.2 ndarray的那些屬性
(1)a.ndim : 陣列的秩(維度總數)
(2)a.shape : 陣列形狀 (矩陣:n行m列)
(3)a.size : 陣列總個數
(4)a.dtype : 元素型別
3.3 索引切片(與串列相似)
3.4 統計函式(求和,均值,方差,極值,中位數)
3.5 開始變換維度&型別!
(1)a.reshape(shape) : 回傳一個shape形狀的陣列
(2)a.flatten() : 對陣列降維折疊成一維陣列
(3)a.swapaxes(ax1,ax2) : 將陣列n個維度中兩個維度進行調換
(4)a.astype(type) : 根據型別創建一個新的陣列
(5)a.tolist() : 重回串列
3.6 Numpy運算函式
(1)np.abs(x) : 計算陣列各元素的絕對值
(2)np.sqrt(x) : 計算陣列各元素的平方根
(3)np.square(x) : 計算陣列各元素的平方
(4)np.log(x) : 計算陣列各元素的自然對數
(5)np.ceil(x) np.floor(x) : 計算陣列各元素的ceiling值、floor值
(6)np.sin(x) np.cos(x) np.tan(x) : 計算陣列各元素的三角函式
(7)np.exp(x) : 計算陣列各元素的指數值
總結
一、前言
本人2020級本科生,坐標北京師范大學,主修人工智能,輔修教育學,在期末周來臨之前萌在CSDN上發文章的想法,這樣做的理由有兩點,一方面可以在學習的同時歸納總結加深記憶,便于自己今后復習回顧;另一方面可以在CSDN這樣的技術交流平臺上留下自己的痕跡,記錄AI人求學路上點滴的成長碎片,
這篇文章即是我在CSDN上發布的“Hello world”專案,希望日后回顧于此能有一些感慨觸動,
二、為什么是Numpy?
作為一個AI科研人,在學習了Python,C,C++,R之后,Python在我的心中就是神一般的存在,我甚至很難想象如果沒有Python的幫助,當代科研的進度會變慢多少,至少在我看來,身邊的老師、師兄師姐幾乎都只用Python作為自己的學習科研工具,這也側面體現出Python在當今計算機科研領域的統治地位,
AI院第一個學期的專業必修課就是Python,這使它成為了我所了解與掌握的第一門語言,我對它保持熱情至今,這也是本篇文章中我將使用的編程語言,
那么為何眾多的工具庫中選擇了Numpy呢?主要是由于Numpy高速而便捷的矩陣處理模式將計算機領域與數學應用領域聯系了起來,影像的矩陣變換,高維陣列操作均可以在Numpy中得到實作,并且2022年寒假美賽將至,對于AI人而言,熟練掌握Numpy科學計算庫也可以和Matlab形成互補,(之前看過北理工嵩天老師的Mooc,講解的很詳細,不過由于缺乏實際操作,記憶丟失的很快,真正需要用到的時候才發現總結回顧真的很重要,這樣可以避免花費大量的無效時間做一件日后回想不起來的事情)
這就是選擇Numpy的原因,
附:Python之禪(隱藏彩蛋)
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
(原文鏈接:https://blog.csdn.net/gzlaiyonghao/article/details/2151918)
演示環境:Jupyter Notebook(anaconda)

三、科學計算庫(Numpy)基礎
3.0 list or ndarray?
如果有一個串列 a = [1,2,3],你想完成全體元素+1的操作應該怎么辦?
串列操作中 "a = a+1" 是不被允許的,編譯器會提示報錯資訊,
numpy的出現解決了這個問題:
a=[1,2,3]
a=np.array(a)+1
array([2, 3, 4])
列印 a 的值,發現元素的確被執行了遍歷操作,但同時,資料型別變成了 numpy.ndarray,
在Numpy中如果對陣列執行一個四則運算,就相當于要對其每一元素做相同的操作;如果陣列操作的物件和它的規模一樣,則其結果就是對應位置進行計算,(廣播機制)
ndarray 是 Numpy 中的底層資料結構,也是后續我們處理的物件,
雖然就目前這個例子而言,我們貌似并沒有看出它強大的功能,但是如果當你像我一樣有過影像處理、高維陣列變換這些實際經歷之后,你會想重新再學習它一遍的,
干貨分割線
3.1 先創建一個ndarray陣列
(1)由 串列&元組 生成
x=np.array(list/tuple,dtype=np.float32)
當不指定dtype時,Numpy將根據資料情況關聯一個dtype型別,
熱知識:在ndarray中所有元素必須是同一型別,否則會自動向下轉換:int ---> float ---> str
(2)由Numpy中的普通函式創建(arange、ones、zeros等)
np.arange(a,b,c) : 類似 range 函式
np.arange(1,8)
array([1, 2, 3, 4, 5, 6, 7])
np.ones(shape) : 根據shape生成全1陣列(shape是元組型別!) 可指定dtype
np.ones((2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
np.zeros(shape) : 根據shape生成全0陣列(shape是元組型別!) 可指定dtype
np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
np.full(shape,val) : 根據shape生成一個用val填充的陣列
np.full((2,3),5)
array([[5, 5, 5],
[5, 5, 5]])
np.eye(n) : 創建一個 n*n 的單位矩陣(對角線為1,其余為0)
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.ones_like(a) : 根據陣列a的形狀生成一個全1陣列
np.zeros_like(a) : 根據陣列a的形狀生成一個全0陣列
np.full_like(a,val) : 根據陣列a的形狀生成一個陣列,每個元素值都是val
np.linspace() : 根據起止資料等距填充,形成陣列
np.concatenate() : 將兩個或多個陣列合并成一個新的陣列
(3)由Numpy中的隨機函式創建(random.rand)
np.random.rand(d1,d2,d3...) : rand函式根據給定維度生成[0,1)之間的資料,包含0,不包含1
np.random.rand(2,3)
array([[0.95969572, 0.09220864, 0.43077609],
[0.94383599, 0.81581984, 0.74196641]])
np.random.randn(d1,d2,d3...) : randn函式回傳一個或一組樣本,具有標準正態分布,
np.random.randint(low,high,size) : 根據size回傳隨機整數,范圍區間為[low,high),
3.2 ndarray的那些屬性
冷知識:ndarray 在程式中的別名是 array
軸(axis):保存資料的維度
秩(rank):軸的數量
(1)a.ndim : 陣列的秩(維度總數)
a=np.array([[1,2,3],[4,5,6]])
a.ndim
2
(2)a.shape : 陣列形狀 (矩陣:n行m列)
a.shape
(2, 3)
(3)a.size : 陣列總個數
a.size
6
(4)a.dtype : 元素型別
a.dtype
dtype('int32')
bool : 布爾型別(True & False)
int c,int p
int 8,int 16,int 32,int 64 有符號整型
uint 8,uint 16,uint 32,uint 64 無符號整型 [0,255]
float 16,float 32,float 64 半精度浮點數
complex 64,complex 128 復數型別
3.3 索引切片(與串列相似)


此處直接參考嵩天老師的PPT,陣列索引切片這個部分還是比較easy的,
補充:bool 索引(陣列條件判斷時可用)
a=np.random.rand(10)
a>0.5
np.where(a>0.5)
array([ True, False, True, False, True, False, True, True, True,
True])
(array([0, 2, 4, 6, 7, 8, 9], dtype=int64),)
a[a>0.5]
a[np.where(a>0.5)]
np.logical_and(a[a>0.5],a[np.where(a>0.5)])
array([0.80976535, 0.74469848, 0.55484932, 0.75266807, 0.606097 ,
0.67212678, 0.68324472])
array([0.80976535, 0.74469848, 0.55484932, 0.75266807, 0.606097 ,
0.67212678, 0.68324472])
array([ True, True, True, True, True, True, True])
3.4 統計函式(求和,均值,方差,極值,中位數)


3.5 開始變換維度&型別!
(1)a.reshape(shape) : 回傳一個shape形狀的陣列
a=np.random.rand(2,4)
a
a=a.reshape((4,2))
a
array([[0.92403131, 0.60942285, 0.24788947, 0.64300871],
[0.5516135 , 0.46864957, 0.14285288, 0.64345045]])
array([[0.92403131, 0.60942285],
[0.24788947, 0.64300871],
[0.5516135 , 0.46864957],
[0.14285288, 0.64345045]])
冷知識:reshape方法保持原陣列不變,resize方法改變原陣列,
(2)a.flatten() : 對陣列降維折疊成一維陣列
a
b=a.flatten()
b
array([[0.92403131, 0.60942285],
[0.24788947, 0.64300871],
[0.5516135 , 0.46864957],
[0.14285288, 0.64345045]])
array([0.92403131, 0.60942285, 0.24788947, 0.64300871, 0.5516135 ,
0.46864957, 0.14285288, 0.64345045])
冷知識:flatten方法保持原陣列不變
(3)a.swapaxes(ax1,ax2) : 將陣列n個維度中兩個維度進行調換
(4)a.astype(type) : 根據型別創建一個新的陣列
a=np.random.randint(2,8,size=(3,3))
a
a.dtype
b=a.astype(np.float)
b
b.dtype
array([[5, 4, 2],
[4, 3, 6],
[7, 5, 4]])
dtype('int32')
array([[5., 4., 2.],
[4., 3., 6.],
[7., 5., 4.]])
dtype('float64')
(5)a.tolist() : 重回串列
a=np.full((2,3,4),25,dtype=np.int)
a
b=a.tolist()
b
array([[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]],
[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]]])
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
3.6 Numpy運算函式
熱知識:陣列與標量的之間的運算作用于陣列的每一個元素
實體:計算 a 與元素平均值之間的商
a=np.arange(24).reshape(2,3,4)
a=a/a.mean()
a
array([[[0. , 0.08695652, 0.17391304, 0.26086957],
[0.34782609, 0.43478261, 0.52173913, 0.60869565],
[0.69565217, 0.7826087 , 0.86956522, 0.95652174]],
[[1.04347826, 1.13043478, 1.2173913 , 1.30434783],
[1.39130435, 1.47826087, 1.56521739, 1.65217391],
[1.73913043, 1.82608696, 1.91304348, 2. ]]])
(1)np.abs(x) : 計算陣列各元素的絕對值
(2)np.sqrt(x) : 計算陣列各元素的平方根
(3)np.square(x) : 計算陣列各元素的平方
(4)np.log(x) : 計算陣列各元素的自然對數
冷知識:np.log10(x) : 10底對數 np.log2(x) : 2底對數
(5)np.ceil(x) np.floor(x) : 計算陣列各元素的ceiling值、floor值
(6)np.sin(x) np.cos(x) np.tan(x) : 計算陣列各元素的三角函式
(7)np.exp(x) : 計算陣列各元素的指數值
總結
本篇文章對Numpy科學計算庫的基礎知識做了一個系統的整理,從一個簡單的問題引出了串列和陣列的操作差異,接著按照 陣列的創建方式、 陣列的屬性、 陣列的切片方法、 陣列的統計函式、 陣列的維度型別變換、 陣列的運算函式 這一邏輯順序回顧了 Numpy 的基本操作,
下一次更新的內容將會以常用功能為導向,對Numpy進行一個擴展延續,從實踐的層面加深對Numpy的認知,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393930.html
標籤:python

