Numpy學習
N維數組對象ndarray
ndarray 數組與 列表均可以表示多維數據,區別在於 使用ndarray進行數據運算時可以不使用循環(使用list進行矩陣操作時要使用循環)
數組的生成:
# 創建數組可以指定數據類型,如果不指定就默認
a = np.arange(10)
print(a)
b = np.ones((3, 6))
print(b)
c = np.zeros((3, 6), dtype=np.int32)
print(c)
np.ones_like(a) 根據數組a的形狀生成一個全一數組
np.zeros_like(a) 根據數組a 生成一個全0數組
np.full_like(a, val) 根據數組a 生成一個數組,每一個元素值都是val
np.linsapce() 根據起止數據等間距的填充數據,形成數組
np.concatenate() 將兩個或多個數組合併成一個新的數組
# a = np.linspace(1, 10, 4) # 第一個爲起始,第二個爲終止,第三個數是劃分的元素個數
# print(a)
# b = np.linspace(1, 10, 4, endpoint=False)
# print(b)
# c = np.concatenate((a, b)) # 合併數組
# print(c)
import numpy as np
# # 生成指定維度的隨機多維數組
# data = np.random.rand(2, 3)
# print(data)
# print(type(data))
# # list 轉化爲ndarray
# l = range(10)
# data = np.array(l)
# print(data)
# print(data.shape)
# print(data.ndim)
# print(type(data))
# # 嵌套序列轉化爲ndarray
# l2 = [range(10), range(10)]
# data = np.array(l2)
# print(data)
# print(data.shape)
# np.zeros, np.ones, 和 np.empty
# np.zeros
zeros_arr = np.zeros((3, 4))
# np.ones
ones_arr = np.ones((2, 3))
#np.empty
empty_arr = np.empty((3, 3))
# np.empty 指定數據類型
empty_int_arr = np.empty((3, 3), int)
print(zeros_arr)
print("---------------")
print(ones_arr)
print("---------------")
print(empty_arr)
print("---------------")
print(empty_int_arr)
ndarray數組的變換
可以進行維度變換和元素類型變換
.reshape(shape) 不改變數組元素,返回一個shape形狀的數組,原數組不變
.resize(shape) 與.reshape()功能一致,但要修改原數組
.swapaxes(ax1, ax2) 將數組n個維度中兩個維度進行調換
.flatten() 對數組進行降維,返回摺疊後的一維數組,原數組不變
# # 維度變換
# # .reshape
# a = np.ones((2, 3, 4), dtype=np.int32)
# print(a.reshape((3, 8)))
# print("-----------------")
# print(a) # a還是(2, 3, 4)維度
# # .resize
# a = np.ones((2, 3, 4), dtype=np.int32)
# a.resize((3, 8))
# print(a) # 已經修改了a 的維度
# # .flatten() 將數組變爲一維,不改變原數組維度
# a = np.ones((2, 3, 4), dtype=np.int32)
# print(a.flatten())
# print("-------------------")
# print(a)
數組類型變換:
將整數變爲浮點數 astype()方法一定會創建一個新數組(拷貝)
# # 數組類型轉換
# a = np.ones((2, 3, 4), dtype=np.int)
# b = a.astype(np.float)
# print(a)
# print("---------------")
# print(b)
ndarray數組想列表的轉換
ls = a.tolist()
# # 數組向列表轉化
# a = np.full((2, 3, 4), 25, dtype=np.int32)
# print(a)
# print("--------------------------")
# print(a.tolist())
矩陣運算與處理:
"""
"""
# # 矢量與矢量運算
# arr = np.array([[1, 2, 3],
# [4, 5, 6]])
# print("元素相乘:")
# print(arr * arr)
#
# print("矩陣相加:")
# print(arr + arr)
# # 矢量與標量運算 點乘與點除
# print(1. / arr)
# print(2. * arr)
"""索引與切片 一維數組的索引與Python列表索引功能相似
多維數組索引
arr[r1:r2, c1:c2] --->代表從矩陣切片範圍(與MATLAB處理相似)
[:] --->代表某個維度的數據
[r1:, :c1]--->
注意:所有的索引值都是從 0 開始(與MATLAB相區別)
"""
# 索引與切片
# 一維數組
arr1 = np.arange(10)
print(arr1)
print(arr1[2:5:2]) # 數字依次爲起始編號:終止編號:步長
# 多維數組
arr2 = np.arange(12).reshape(3, 4)
print(arr2)
print(arr2[1])
print(arr2[0:2, 2:])
print(arr2[:, 1:3])
條件索引:
注意:多個條件組合使用時使用& | 表示 和 或
# 條件索引
# 找出data_arr 中2015年後的數據
data_arr = np.random.rand(3, 3)
print(data_arr)
print("")
year_arr = np.array([[2000, 2001, 2000],
[2005, 2002, 2009],
[2001, 2003, 2010]])
# 兩個矩陣維數相同,數據也依次對應,現在篩選出年份大於2005的數據
filter_arr = data_arr[year_arr >=2005]
print(filter_arr)
print("")
# 多個條件
filter_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
print(filter_arr)
轉置(transpose)
高維數組轉置要指定編號(0, 1,2 ,3)
# 轉置
arr = np.random.rand(2, 3)
print(arr)
print(arr.transpose())
print("")
# 三維數組
arr3d = np.random.rand(2, 3, 4)
print(arr3d)
print("-------")
print(arr3d.transpose((1, 0, 2)))
通用函數 :
ceil 向上最接近的整數
floor 向下最接近的整數
rint 四捨五入
isnan 判斷元素是否爲NaN
multiply 元素相乘
divide 元素相除
# 通用函數
arr = np.random.randn(2, 3)
print(arr)
print(np.ceil(arr))
print(np.floor(arr))
print(np.rint(arr))
print(np.isnan(arr))
np.where
矢量版本的三元表達式 x if condition else y
使用np.where np.where(condition, x, y)
# np.where
arr = np.random.randn(3, 4)
print(arr)
print(np.where(arr > 0, 1, -1)) # 如果arr大於0 輸出1,否則輸出-1
常用的統計方法
np.mean , np.sum
np.max , np.min
np.std , np.var
np.argmax , np.argmin
np.cumsum , np.cumprod
# 數組與標量之間的運算
a = np.arange(14).reshape(2, 7)
print(a.mean())
注意:多維的話要指定維度,否則默認是在全部維度上做統計
# 求和
arr = np.arange(10).reshape(5, 2)
print(arr)
print(np.sum(arr))
print(np.sum(arr, axis=0)) # axis=0是指豎直方向的一列
print(np.sum(arr, axis=1)) # axis=1是指橫向的一行
ndarray中元素級運算:
np.abs(x) np.fabs() 計算各元素絕對值
np.sqrt(x) 計算數組各元素平方根
np.square(x) 計算數組各元素的平方
np.log(x) np.log10(x) np.log2(x) 計算各數組的自然對數、10爲底對數、2底對數
np.ceil(x) np.floor(x) 計算數組各元素ceiling值(不超過元素的整數值)或floor值(小於元素的最大整數值)
np.rint(x) 計算各元素的四捨五入值
np.modf(x) 將數組各元素的小數和整數部分以兩個獨立數組形式返回
np.cos(x) np.cosh(x) 計算數組各元素的普通型和雙曲型三角函數
np.sin(x) np.sinh(x)
np.tan(x) np.tanh(x)
np.exp(x) 計算數組各元素的指數值
np.sign(x) 計算數組各元素的符號值,1(+),0(0),-1(-)正數輸出1.。。。。
np.all和np.any
all 全部滿足條件
any 至少有一個元素滿足條件
# np.all 和np.any
arr = np.random.randn(2, 3)
print(arr)
print(np.all(arr > 0))
print(np.any(arr > 0))
np.unique 找到唯一值並返回排序結果
# np.unique
arr = np.array([[1, 2, 1], [2, 3, 4]])
print(arr)
print(np.unique(arr))
文件存取
csv文件
說明:CSV文件只能存取一維二維數組
CSV(逗號分隔值)一種常見文件格式,用於批量處理數據。
文件寫入CSV格式:
np.savetxt(frame,array,fmt=’.18e’,delimiter=None)
frame 文件、字符串或產生器,可以是.gz或者.bz2的壓縮文件。
array 存入文件的數組
fmt 寫入文件的格式,例如:%d%.2f%.18e
delimiter 分隔字符串,默認是任何空格
CSV文件讀入:
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=Flase)
frame 文件、字符串或產生器,可以是.gz或者.bz2的壓縮文件。
dtype 數據類型,可選
delimiter 分隔字符串,默認是任何空格
unpack 如果True,讀入屬性將分別寫入不同變量
# 存入CSV文件
a = np.arange(100).reshape(5, 20)
print(a)
print("-----------------------------")
np.savetxt("a.csv", a, fmt="%d", delimiter=",") # 自動寫入項目中
# 讀入CSV文件
b = np.loadtxt("a.csv",dtype=np.int, delimiter=",")
print(b)
多維數據的存取
寫入:
a. tofile(frame, sep=””, formate”%s”)
frame 文件、字符串
sep 數據分隔字符串,如果是空格,寫入文件爲二進制
format 寫入數據格式
讀出:
注意:使用該方法讀取時需要知道存入文件時數組維度和元素類型
np.fromfile(frame, dtype=float, count=-1, sep=””)
frame 文件、字符串
dtype 讀取的數據類型
count 讀入元素個數,-1表示讀入整個文件
sep 數據分隔字符串,如果是空格,寫入文件爲二進制
# 多維數據的存取
# 存入
a = np.arange(100).reshape(5, 10, 2)
a.tofile("b.dat", sep=",", format="%d") # 如果沒有sep=","則數據存爲二進制文件(可以作爲文件備份方式)
# 讀出(文本文件)
c = np.fromfile("b.dat", dtype=np.int, count=-1, sep=",")
print(c)
c = np.fromfile("b.dat", dtype=np.int, count=-1, sep=",").reshape(5, 10, 2)
print(c)
# 讀出(二進制文件)
a = np.arange(100).reshape(5, 10, 2)
a.tofile("b.dat", format="%d") # 文件爲二進制格式,無法讀出
c = np.fromfile("b.dat", dtype=np.int).reshape(5, 10, 2) # 修改爲文件格式
print(c)
NumPy的便捷文件存取:
存入:
np.save(fname, array) 或np.savez(fname, array)
frame: 文件名,以.npy爲擴展名,壓縮擴展名爲.npz
array: 數組變量
讀取:
np.load(fname)
frame:文件名,以.npy爲擴展名,壓縮擴展名爲.npz
# NumPy的便捷文件存取
a = np.arange(100).reshape(5, 10, 2)
np.save("ahhh.npy", a) # 保存格式也是二進制格式,不過在二進制文件開頭有數組保存之前的原信息(包括維度,數據類型)
b = np.load("ahhh.npy")
print(b)
Numpy的隨機數函數字庫
隨機數生成:
NumPyd的random字庫(np.random.*)
rand(d0, d1, ...,dn) 根據d0-dn創建隨機數數組,浮點數,在【0,1】之間產生並均勻分佈
randn(d0,d1,d2...dn) 根據d0-dn創建隨機數數組,標準正態分佈
randint(low[,high,shape]) 根據shape創建隨機數或整數數組,範圍是【low,high)
seed(s) 隨機數種子,s是給定的種子值
import numpy as np
# rand [0, 1]隨機數
a = np.random.rand(3, 4, 5)
print(a)
# randn 生成正態分佈隨機數
sn = np.random.randn(3, 4, 5)
print(sn)
# rindint根據shape創建隨機數或整數數組
b = np.random.randint(100, 200, (3, 4))
print(b)
# seed(s) 隨機數種子,s是給定的種子值
np.random.seed(10) # 調用同一個隨機數種子。產生的隨機數相同
print(np.random.randint(100, 200, (3, 4)))
print("-------------------------------------")
np.random.seed(10)
print(np.random.randint(100, 200, (3, 4)))
從已有數組中隨機抽取元素構成數組:
shuffle(a) 根據數組a 的第一軸進行隨機排列,改變數組x
permutation(a) 根據數組a 的第一軸產生一個新的亂序數組,不改變數組x
choice(a, [, size,replace, p]) replace表示是否可以重用元素,默認爲False
# 從已有數組中隨機抽取元素構成數組
# shuffle
a = np.random.randint(100, 200, (3, 4))
print(a)
np.random.shuffle(a) # 改變數組
print(a)
# permutation
a = np.random.randint(100, 200, (3, 4))
print(a)
print(np.random.permutation(a)) # 改變數組
print("----------------------------")
print(a)
# 隨機抽取元素構成新數組
b = np.random.randint(100, 200, (8,))
print(b)
print(np.random.choice(b, (3, 2)))
print("**************************")
print(np.random.choice(b, (3, 2), replace=False)) # 選取元素不在重複
print("++++++++++++++++++++++")
print(np.random.choice(b, (3, 2), p=b/np.sum(b))) # p代表元素抽取概率(元素越大,概率越大)
產生具有一定分佈的隨機數:
uniform(low, high, size) 產生均勻分佈的數組,low爲起始值,high爲結束值
normal(loc, scale, size) 正態分佈數組,loc均值,scale標準差,size形狀
poisson(lam, size) 產生泊松分佈數組,lam隨機事件發生概率
# 產生具有一定分佈的隨機數
u = np.random.uniform(0, 10, (3, 4))
print(u)
print("###############################")
n = np.random.normal(10, 5, (3, 4))
print(n)
NumPy的統計函數
sum(a, axis=None) 根據給定軸axis計算數組a相關元素之和,axis整數或元組
mean(a, axis=None) 根據給定軸axis計算數組a相關元素期望
average(a, axis=None, weight=None) 根據給定軸axis計算數組a相關元素加權平均值
std(a,axis=None) 根據給定軸axis計算數組a相關元素標準差
var(a, axis=None) 根據給定軸axis計算數組a相關元素方差
# 統計函數(1)
a = np.arange(15).reshape(3, 5)
print(a)
print(np.sum(a))
print("")
print(np.mean(a, axis=1))
print(np.mean(a, axis=0))
print("")
print(np.average(a, axis=0, weights=[10, 5, 1])) # weight 代表權重,每行權重爲10、5、1
print(np.std(a))
print(np.var(a))
min(a) max(a) 計算數組a 中元素最小最大值
argmin(a) argmax(a) 計算數組a中元素最小最大值的降一維後下標
unravel_index(index, shape) 根據shape將一維下標index轉換爲多爲、維下標
ptp(a) 計算數組a 中元素極差
median(a) 計算數組a元素中位數(中值)
# 統計函數(2)
b = np.arange(15, 0, -1).reshape(3, 5)
print(b)
print(np.max(b))
print(np.argmax(b)) # 一維
print("")
print(np.unravel_index(np.argmax(b), b.shape)) # 重塑爲多維下標
print(np.ptp(b)) # 數組極差
print("")
print(np.median(b)) # 中位數
NumPy的梯度函數
說明:用於圖像聲音處理
梯度:連續值之間的變化率,即斜率
np.gradient(f) 計算數組f中元素梯度,當f 爲多維時,返回每個維度梯度
圖像數組表示
RGB模式:r 表示紅色,取值範圍0-255、g.....、b......
PIL庫:圖像處理庫
待更......