1. 程式人生 > >scipy庫numpy常用方法

scipy庫numpy常用方法

一。 numpy簡介

n umPy 是一個 Python 包。 它代表 “Numeric Python”。 它是一個由多維陣列物件和用於處理陣列的例程集合組成的庫。

Numeric,即 NumPy 的前身,是由 Jim Hugunin 開發的。 也開發了另一個包 Numarray ,它擁有一些額外的功能。 2005年,Travis Oliphant 通過將 Numarray 的功能整合到 Numeric 包中來建立 NumPy 包。 這個開源專案有很多貢獻者。
numpy參考 :http://www.runoob.com/numpy/numpy-matplotlib.html
numpy官網  :http://www.numpy.org/

             

二。numpy常用操作

1.numpy建立ndarray

NumPy 陣列的維數稱為秩(rank),一維陣列的秩為 1,二維陣列的秩為 2,以此類推。

在 NumPy中,每一個線性的陣列稱為是一個軸(axis),也就是維度(dimensions)。比如說,二維陣列相當於是兩個一維陣列,其中第一個一維陣列中每個元素又是一個一維陣列。所以一維陣列就是 NumPy 中的軸(axis),第一個軸相當於是底層陣列,第二個軸是底層數組裡的陣列。而軸的數量——秩,就是陣列的維數。

很多時候可以宣告 axis。axis=0,表示沿著第 0 軸進行操作,即對每一列進行操作;axis=1,表示沿著第1軸進行操作,即對每一行進行操作。

NumPy 的陣列中比較重要 ndarray 物件屬性有:

屬性 說明
ndarray.ndim 秩,即軸的數量或維度的數量
ndarray.shape 陣列的維度,對於矩陣,n 行 m 列
ndarray.size 陣列元素的總個數,相當於 .shape 中 n*m 的值
ndarray.dtype ndarray 物件的元素型別
ndarray.itemsize ndarray 物件中每個元素的大小,以位元組為單位
ndarray.flags ndarray 物件的記憶體資訊
ndarray.real ndarray元素的實部
ndarray.image ndarray 元素的虛部
ndarray.data 包含實際陣列元素的緩衝區,由於一般通過陣列的索引獲取元素,所以通常不需要使用這個屬性。

可以通過建立一個數組來獲得他的屬性

p=np.array([[1,2],[3,4]])
print(p.dtype)
print(p.shape)

列印結果:

int32
(2, 2)

關於他的建立方式非常多

import numpy as np
#建立矩陣
a=np.array([[1,2],[3,4]]);
#建立一個 3*3矩陣 預設值都是1
po=np.ones((3,3));
print(po);
#建立一個 4*4矩陣 預設值都是0
po=np.zeros((4,4))
print(po);
#建立一個方形矩陣 對角線是1  其他值都是0
po=np.eye(4)
print(po);
#建立一個5*5矩陣 初始值全部是5
po=np.full((5,5),5)
print(po);
#建立一個一維向量 從 1-9 步長是1
po=np.arange(1,10,1);
po=np.array([n for n in range(1,10,1)]);#等價
print(po);
print(po)

#建立一個等差數列的向量 從1-100 產生20個元素(預設50個)
po=np.linspace(1,100,20);
print(po)
'''產生一個等比數列 1-100次冪中產生10個數的等比數列
第一個數:1.000000e+001 就等於1.000000乘以10的+001次冪,也就是10
第二個數:1.00000000e+012 就等於 1.000000 乘以10的+023次冪 也就是 10**12
'''
po=np.logspace(1,100,10);
print(po)
print(1.00000000e+001)
#建指定形狀和dtype的未初始化陣列。 它使用以下建構函式:
po=np.empty((2,3))
print(po);

'''
沿著軸線將資料設定成索引值
[[[0 0 0 0]
  [1 1 1 1]
  [2 2 2 2]] 水平
 [[0 1 2 3]
  [0 1 2 3]
  [0 1 2 3]]] 垂直
'''
po=np.indices((3,4));
print(po);

2。np切片操作

  np可以使用下標的方式來進行切片 擷取 具體語法參考:

import numpy as np

p=np.array([n for n in range(1,10)]).reshape((3,3))
'''
[[1 2 3]
 [4 5 6]
 [7 8 9]]
'''
print(p);
'''
返回第1行
[1 2 3]
'''
print(p[0])
'''
返回第1行到第二行 但是不包括第二行 還是個二維陣列
:表示當前維度   通過將由冒號分隔的切片引數(start:stop:step)直接提供給ndarray物件
,用於分割維度
[[1 2 3]]
'''
#表示一行到第二行 不包括第二行
print(p[0:1])
#表示從 第一行到第四行不包括4 每次跳 2步
print(p[0:3:2])


#返回第 1行 第2列的元素
print(p[0,2])
#返回第1行的第2-3個元素 都是包含開頭不包含結尾
print(p[0,1:3])
#返回所有行和所有列
print(p[:,:])
#返回第二行和第三列所有元素
print(p[1:,2:])
# -1表示最後一行
print(p[-1])
# -表示最後一行和最後一列
print(p[-1,-1])
#按照條件擷取
#找出所有大於5的
print(p[p>5])
#找出所有偶數
print(p[p%2==0])
#查詢所有的陣列 取反
a=np.array([1,2,np.nan,np.nan])
print(a[~np.isnan(a)])

3。矩陣的合併

可以通過np的某些方法水平或者垂直合併矩陣

import numpy as np

p=np.arange(1,10).reshape((3,3));
p1=np.array([[-1,4,6],
    [-2,8,11],
    [8,3,1]
    ]);
print(p);
print(p1);

#合併矩陣 預設是在水平方向合併
print(np.concatenate((p,p1)));
print(np.hstack((p,p1))) #水平合併
# 0表示1維水平方向 1表示二維方向上 也就是垂直方向
print(np.concatenate((p,p1),axis=1));
print(np.vstack((p,p1))) #垂直合併

4。矩陣的計算

乘法運算

import numpy as np


p=np.array([[-1,4],
            [-2,8]
            ]);
p1=np.array([[4,6],
            [3,1]
            ]);
#矩陣乘法是將各個位置的值相乘
p3=p*p1;
print(p3);
print(np.multiply(p,p1)) #等價於上面
#點乘法 是將行和列相乘
'''
第一行的任意數字和第一列的任意數字累加
-1*4+-4*3=8  最後在第一行
第一行的任意數字和第二列的任意數字累加
-1*6+4*1=-2 在第一行

接下來第二行和第一列和第二列點乘 放在第二列
'''
print(np.dot(p,p1));#兩個陣列的點積,即元素對應相乘。 dot通用所有陣列
print(np.matmul(p,p1))#兩個陣列的矩陣積

p=np.array([1,2]);
p1=np.array([2,3]);
print(np.vdot(p,p1))#兩個向量的點積  1*2+2*3=8
print(np.inner(p,p1))

矩陣轉置

import numpy as np
p=np.array([[-1,4,5],
            [-2,8,6]
            ]);
#將第一行轉換成第一列 其他行轉換其他列
p1=p.transpose();
print(p1);
print(p.T);#等價於上面

逆矩陣 


A是數域上的一個n階矩陣,若在相同數域上存在另一個n階矩陣B,使得: AB=BA=,則我們稱BA的逆矩陣,而A則被稱為可逆矩陣。注:E為單位矩陣

比如:

按照矩陣的乘法滿足:

  (同一個值)

故A,B互為逆矩陣。

#必須是方形矩陣才能求逆矩陣
a = np.array([[1,2],[4,5]])
print(np.linalg.inv(a))

5。矩陣資料篩選

矩陣除了之前分片的方式之外,還可以通過不同的方式來篩選資料 比如 最大值,最小值,平均值,方差,求和,排序等操作來獲取需要的資料

import numpy as np
p=np.array([[-1,4],
            [-2,8]
            ]);
############求最大最小值#############
#獲取整個矩陣的最大值 8
print(np.max(p))
print(np.max(p,axis=1)) #獲取當前維度的最大值 二維就是每一行的最大值


print(np.argmax(p)) #從1維角度找到最大值的下標 8 在第4個位置也就是3上
print(np.argmax(p,axis=1)) #從2維角度獲取最大值的下標 就是座標 (1,1)
#獲取最小值 -2
print(np.min(p))
print(np.argmin(p)) #獲取最小值的位置 和 argmax一樣
############求平均值#############
p1=np.array([[4,6],
            [3,1]
            ]);
print(np.mean(p1))  #4+6+3+1/4=3.5 也可以設定水平和垂直
print(np.mean(p1,axis=0)) #[3.5,3.5] 垂直
print(np.mean(p1,axis=1)) #[5,3] 水平

############方差#############
print(np.var(p1))
print(np.mean(abs(p1 - p1.mean())**2))

import numpy as np;
arr=np.array([1,2,3,100,55])
#var 方差即各項-均值的平方求和後再除以N ,表示資料離平均資料的距離,表示資料的離散程度
print(np.var(arr))
print(np.sum(np.abs(arr-np.mean(arr))**2)/len(arr))#等價程式碼
print(np.mean(abs(arr - arr.mean())**2)) #等價程式碼

#std:表示標準差,是var的平方根。
print(np.std(arr))
print(np.sqrt(np.var(arr)));

#cov:協方差 ,與var類似,但是除以(N-1)
print(np.cov(arr));
print(np.sum(np.abs(arr-np.mean(arr))**2)/(len(arr)-1))#等價程式碼

關於排序的方法

import numpy as np
#預設按照行排序
p=np.array([[-1,8],
            [4,-2]
            ]);

print(np.sort(p))
#按照列排序
print(np.sort(p,axis=0))


#自定義物件資料型別 參考http://www.runoob.com/numpy/numpy-dtype.html 按照欄位排序
mtype=np.dtype([('name','S'),('age',int)])
p=np.array([('zs',20),('ww',60),('zl',30)],dtype=mtype)
print(np.sort(p,order='age'))

p=np.array([3,1,2])
#argsort() 函式返回的是陣列值從小到大的索引值。
print(np.argsort(p))
#逆序
print(np.sort(p)[::-1])

三。numpy影象配套庫 matplotlib

電影名稱 打鬥鏡頭 接吻鏡頭 電影型別
神鵰俠侶 100       20       動作片
毒液:致命守護者 99 10     動作片
碟中諜6:全面瓦解 67 5   動作片
熱情如火  40 125   動作片
泰坦尼克號 0 10 愛情片
倩女幽魂 10       20     愛情片
大話西遊之月光寶盒 10 40      愛情片
烈火如歌 1    30 愛情片




程式碼(繪製是二維圖 所以指定一個x和y座標的陣列):

arr=np.array([[100,200],[99,10],[67,5],[40,125],[0,10],[10,20],[10,40],[1,30]]);
tarr=np.array([1,1,1,0,0,0,0]); #1表示動作片 0表示愛情片
x=arr[:,:1].T[0]
y=arr[:,1:].T[0]
print(x)
print(y)
#設定字型
mp.rcParams['font.family']=['STFangsong']
mp.title("電影型別圖")
mp.xlabel("打鬥鏡頭")
mp.ylabel("接吻鏡頭")
#第三個引數 o表示使用 散點  r表示red紅色
mp.plot(x,y,"or")
mp.show();

執行結果:

以下是k鄰近演算法的實現

#判斷打鬥鏡頭44  接吻鏡頭 12到底是哪種型別的片片了
ndata=[44,12]
#計算當前這個ndata的座標和之前所有資料的座標的距離 放在一個jl陣列中
#距離計算公式是 歐氏距離  (x-x1)**2 +(y-y1)**2 開平方根
# jl中每個下標的資料 就是ndata和對應位置xy座標的距離
jl=[np.sqrt((ndata[0]-i[0])**2+(ndata[0]-i[1])**2) for i in arr];
print("未排序的資料是",jl);
#對距離進行排序  然後獲取排序後的下標
#  比如陣列:      [10,12,8]
#  argsort升序   [2,0,1]
jlsort=np.argsort(jl);
print("排序的索引是",jlsort);
k=3;
print(jlsort[:k])
#獲取指定k 前三個值最小下標的標籤 也就是前三個距離最近的都是什麼型別的電影
# 比如[1,1,0]
flaga=[tarr[t] for t in jlsort[:k]];
print(flaga)
#統計型別集合的哪個出現的次數 會得到一個字典
#[(1,2),(0,1)]
group=c.Counter(flaga);#注意匯入 import collections as c;
#獲取到個數排序(從大到小) 值最大的前1個
#[(1,2)]  [0][0]獲取到1 型別就是動作片羅
print(group.most_common(1)[0][0]);
#來個三目判斷下 輸出中文
result=("動作片" if group.most_common(1)[0][0]==1 else "愛情片");
print(result);