NUMPY INTRODUCTION
NUMPY 提供了一個在Python中做科學計算的基礎庫,重在數值計算,主要用於處理多維數組,用於儲存和處理大型矩陣,本身是由C語言開發,比python自身的列表結構要高效的多。
高性能科學計算和數據分析的基礎包,總結:
• NUMPY是一個Python科學計算基礎庫,提供了多維向量
• NUMPY提供了用於數組快速操作的方法,數學,邏輯,排序,選擇,線性代數,統計等
• NUMPY采用預編譯的C代碼完成,效率更高
安裝:
pip install numpy
使用:
import numpy as np
行業慣例將np作為numpy,將pd作為pandas。下文所有np均指的是numpy
認識軸:
軸【axis】:
既然是多維數組,先理清一下軸,類似於我們學習的X、Y、Z
二維數組的軸:
圖一
三維數組的軸:
圖二
使用NUMPY創建數組:
例:創建一個圖一的數組
1 | 2 | 3 |
4 | 5 | 6 |
方法1: np.array([])
a=np.array([[1,2,3],[4,5,6]]) b=np.array([range(1,4),range(4,7)]) c=np.array([[i for i in range(1,4)],[i for i in range(4,7)]])
[[1 2 3]
[4 5 6]]
方法2: np.arange()
#1~6 步數為1
d=np.arange(1,7,1)
[1,2,3,4,5,6]
#將一維數組轉變為二維
d=d.reshape(2,3)
[[1 2 3]
[4 5 6]]
常用屬性和方法
形狀
ndarray.shape
重新改變數組形狀
ndarray.reshape(x_dim, y_dim, z_dim,…)
數組的維度
ndarray.ndim
itemsize輸出array元素的字節數
numpy.itemsize
數組的形狀:
nparray.shape:
#查看數組的形狀維度
d=np.arange(1,7,1) print(d.shape)
(6,)
nparray.reshape:
#改變數組的維度,規則1*6==2*3
d=d.reshape(2,3). #或者: d=np.reshape(d,(2,3)) print(d.shape)
(2, 3)
獲取數組的維度,可使用len(nparray.shape),即元祖的維度,即
numpy.itemsize
將多維數組轉換為一維數組方式:
自己動手:
def createOnenp(nparray): num=1 for i in len(nparray.shape): num=num*nparray.shape[i] return nparray.reshape(num)
實際又是自己在造輪子,可使用np自帶方法:
nparray= nparray.flatten()
a=np.array([[1,2,3],[4,5,6]]) print(a) a=a.flatten() print(a)
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
數組的計算:
情況一:數組和數值直接運算
a=np.array([i for i in range(1,7)])#生產一維數組 a=a.reshpe(2,3)
[[1 2 3]
[4 5 6]]
數組可以直接與數字進行四則運算(+、-、*、/)
即數組里的每一個值分別四則運算
print(a+2)
[[3 4 5]
[6 7 8]]
print(a/0)
[[inf inf inf]
[inf inf inf]]
在numpy中,/0並不會報錯,
inf(infimum)表示無窮,
nan(not a number)代表未定義或不可表示的值,
情況二:數組與數組計算
這里要注意了,數組和數組的計算和矩陣是不同的
矩陣的乘積:
數組的乘積:
相同的多維數組或直接與單維度軸相同,可以直接四則運算:
方式:廣播(broadcast)

a:
[[1 2 3]
[4 5 6]]
print(a*a)
[[ 1 4 9]
[16 25 36]]
b:
[1 2 3]
print(a*b)
[[ 1 4 9]
[ 4 10 18]]
c:
[[1]
[2]]
print(a*c)
[[ 1 2 3]
[ 8 10 12]]
數組的操作:
1、轉置操作
a=np.array([i for i in range(1,7)])#生產一維數組 a=a.reshpe(2,3)
[[1 2 3]
[4 5 6]]
- a.T
[[1 4]
[2 5]
[3 6]]
- a.transpose()
[[1 4]
[2 5]
[3 6]]
- a.swapaxes(1,0) #交換0軸和1軸
[[1 4]
[2 5]
[3 6]]
2、切片
a=np.array([i for i in range(1,10)])#生產一維數組 a=a.reshpe(3,3)
[[1 2 3]
[4 5 6]
[7 8 9]]
2.1取行
2.1.1、取第x行
print(a[x])
print(a[1])
[4 5 6]
2.1.2、取多行
print(a[[x,x]])
print(a[[0,2]])#取第一行和第三行
[[1 2 3]
[7 8 9]]
2.1.3、取連續多行
print(a[x:y:z]) #連續取從x行到y行,不包括y,間隔為z
print(a[0:3])#取第一行到第四行不包括第四行,也就是前面三行,和list切片類似,左閉右開
[[1 2 3]
[4 5 6]
[7 8 9]]
print(a[0:3:2])
[[1 2 3]
[7 8 9]]
2.2取列
和取行類似
a[:,x]#取x列
a[:,x:y]#取下標為x到下標為y-1的列
a[:,x:y:z]#取下標為x到下標為y-1,間隔為z的列
a[:,[x,y]] #取下標為x,y的兩列
2.3取某一點
a[1,1]=a[1][1]
5
2.4取某一部分
print(a[1:3,1:3])
[[5 6]
[8 9]]
布爾索引、三元運算、裁剪
a=np.array([i for i in range(1,10)])#生產一維數組 a=a.reshpe(3,3)
[[1 2 3]
[4 5 6]
[7 8 9]]
布爾索引:
print(a>5)
[[False False False]
[False False True]
[ True True True]]
print(a[a>5])
[6 7 8 9]
a[a>5]=5
print(a)
[[1 2 3]
[4 5 5]
[5 5 5]]
三元運算:
data1=np.where(a<5,1,9)#比5小的全部修改為1,其他的改為9 Print(data1)
[[1 1 1]
[1 9 9]
[9 9 9]]
裁剪
data2=a.clip(3,7)#小於3的替換為3,大於7的替換為7 print(data2)
[[3 3 3]
[4 5 6]
[7 7 7]]
常用的統計函數
求和:nparray.sum(axis=None)
均值:nparray.mean(axis=None) 受離群點的影響較大
中值:np.median(nparray,axis=None)
最大值:nparray.max(axis=None)
最小值:nparray.min(axis=None)
極值:np.ptp(nparray,axis=None) 即最大值和最小值只差
標准差:nparray.std(axis=None)
其他方法
獲取最大值最小值的位置
np.argmax(nparray,axis=0)
np.argmin(nparray,axis=1)
創建一個全0的數組: np.zeros((3,3))
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
創建一個全1的數組: np.ones((3,3))
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
創建一個對角線為1的正方形數組(方陣):np.eye(3)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
NUMPY中的復制操作
a=b 完全不復制,a和b相互影響
a = b[:],視圖的操作,一種切片,會創建新的對象a,但是a的數據完全由b保管,他們兩個的數據變化是一致的,
a = b.copy(),復制,a和b互不影響
等等用法:
• numpy.sort()
• numpy.amin() numpy.amax()
• numpy.mean() numpy.average()
• numpy.std() # sqrt(mean((x - x.mean())**2))
• numpy.var() # mean((x - x.mean())** 2)
• numpy.sin() cos() tan() pi arcsin(), arccos() arctan() degrees()