Python_Numpy學習

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

高維數組轉置要指定編號(012 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+),00),-1-)正數輸出1.。。。。

 

 

 

 

 

 

np.allnp.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的隨機數函數字庫

隨機數生成:

NumPydrandom字庫(np.random.*)

rand(d0, d1, ...,dn) 根據d0-dn創建隨機數數組,浮點數,在【0,1】之間產生並均勻分佈

randn(d0,d1,d2...dn) 根據d0-dn創建隨機數數組,標準正態分佈

randint(low[,high,shape]) 根據shape創建隨機數或整數數組,範圍是【lowhigh

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)))

 

 

從已有數組中隨機抽取元素構成數組:

shufflea 根據數組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 代表權重,每行權重爲1051
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-255g.....b......

PIL庫:圖像處理庫

 

待更......

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章