程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Numpy python開源的科學計算工具包

編輯:Python

Numpy python開源的科學計算工具包

NumPy數組是一個多維數組對象,稱為ndarray。其由兩部分組成:
① 實際的數據
② 描述這些數據的元數據

 #多維數組ndarray
import numpy as np
ar = np.array([1,2,3,4,5,6,7])
print(ar) # 輸出數組,注意數組的格式:中括號,元素之間沒有逗號(和列表區分)
print(ar.ndim) # 輸出數組維度的個數(軸數),或者說“秩”,維度的數量也稱rank
print(ar.shape) # 數組的維度,對於n行m列的數組,shape為(n,m)
print(ar.size) # 數組的元素總數,對於n行m列的數組,元素總數為n*m
print(ar.dtype) # 數組中元素的類型,類似type()(注意了,type()是函數,.dtype是方法)
print(ar.itemsize) # 數組中每個元素的字節大小,int32l類型字節為4,float64的字節為8
print(ar.data) # 包含實際數組元素的緩沖區,由於一般通過數組的索引獲取元素,所以通常不需要使用這個屬性。
ar # 交互方式下輸出,會有array(數組)
# 數組的基本屬性
# ① 數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2,以此類推
# ② 在NumPy中,每一個線性的數組稱為是一個軸(axes),秩其實是描述軸的數量:
# 比如說,二維數組相當於是兩個一維數組,其中第一個一維數組中每個元素又是一個一維數組
# 所以一維數組就是NumPy中的軸(axes),第一個軸相當於是底層數組,第二個軸是底層數組裡的數組。
# 而軸的數量——秩,就是數組的維數。

創建數組:array()函數,括號內可以是列表、元祖、數組、生成器等

ar1 = np.array(range(10)) # 整型
ar2 = np.array([1,2,3.14,4,5]) # 浮點型
ar3 = np.array([[1,2,3],('a','b','c')]) # 二維數組:嵌套序列(列表,元祖均可)
ar4 = np.array([[1,2,3],('a','b','c','d')]) # 注意嵌套序列數量不一會怎麼樣
print(ar1,type(ar1),ar1.dtype)
print(ar2,type(ar2),ar2.dtype)
print(ar3,ar3.shape,ar3.ndim,ar3.size) # 二維數組,共6個元素
print(ar4,ar4.shape,ar4.ndim,ar4.size) # 一維數組,共2個元素
**# 創建數組:arange(),類似range(),在給定間隔內返回均勻間隔的值。
print(np.arange(10)) # 返回0-9,整型
print(np.arange(10.0)) # 返回0.0-9.0,浮點型
print(np.arange(5,12)) # 返回5-11
print(np.arange(5.0,12,2)) # 返回5.0-12.0,步長為2
print(np.arange(10000)) # 如果數組太大而無法打印,NumPy會自動跳過數組的中心部分,並只打印邊角:**
# 創建數組:linspace():返回在間隔[開始,停止]上計算的num個均勻間隔的樣本。
ar1 = np.linspace(2.0, 3.0, num=5)
ar2 = np.linspace(2.0, 3.0, num=5, endpoint=False)
ar3 = np.linspace(2.0, 3.0, num=5, retstep=True)
print(ar1,type(ar1))
print(ar2)
print(ar3,type(ar3))
# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# start:起始值,stop:結束值
# num:生成樣本數,默認為50
# endpoint:如果為真,則停止是最後一個樣本。否則,不包括在內。默認值為True。
# retstep:如果為真,返回(樣本,步驟),其中步長是樣本之間的間距 → 輸出為一個包含2個元素的元祖,第一個元素為array,第二個為步長實際值
# 創建數組:zeros()/zeros_like()/ones()/ones_like()
ar1 = np.zeros(5)
ar2 = np.zeros((2,2), dtype = np.int)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
print('------')
# numpy.zeros(shape, dtype=float, order='C'):返回給定形狀和類型的新數組,用零填充。
# shape:數組緯度,二維以上需要用(),且輸入參數為整數
# dtype:數據類型,默認numpy.float64
# order:是否在存儲器中以C或Fortran連續(按行或列方式)存儲多維數據。
ar3 = np.array([list(range(5)),list(range(5,10))])
ar4 = np.zeros_like(ar3)
print(ar3)
print(ar4)
print('------')
# 返回具有與給定數組相同的形狀和類型的零數組,這裡ar4根據ar3的形狀和dtype創建一個全0的數組
ar5 = np.ones(9)
ar6 = np.ones((2,3,4))
ar7 = np.ones_like(ar3)
print(ar5)
print(ar6)
print(ar7)
# ones()/ones_like()和zeros()/zeros_like()一樣,只是填充為1
# 創建數組:eye()
print(np.eye(5))
# 創建一個正方的N*N的單位矩陣,對角線值為1,其余為0

ndarray的數據類型

bool 用一個字節存儲的布爾類型(True或False)
inti 由所在平台決定其大小的整數(一般為int32或int64)
int8 一個字節大小,-128 至 127
int16 整數,-32768 至 32767
int32 整數,-2 ** 31 至 2 ** 32 -1
int64 整數,-2 ** 63 至 2 ** 63 - 1
uint8 無符號整數,0 至 255
uint16 無符號整數,0 至 65535
uint32 無符號整數,0 至 2 ** 32 - 1
uint64 無符號整數,0 至 2 ** 64 - 1
float16 半精度浮點數:16位,正負號1位,指數5位,精度10位
float32 單精度浮點數:32位,正負號1位,指數8位,精度23位
float64或float 雙精度浮點數:64位,正負號1位,指數11位,精度52位
complex64 復數,分別用兩個32位浮點數表示實部和虛部
complex128或complex 復數,分別用兩個64位浮點數表示實部和虛部

numpy通用函數

# 數組形狀:.T/.reshape()/.resize()
ar1 = np.arange(10)
ar2 = np.ones((5,2))
print(ar1,'\n',ar1.T)
print(ar2,'\n',ar2.T)
print('------')
# .T方法:轉置,例如原shape為(3,4)/(2,3,4),轉置結果為(4,3)/(4,3,2) → 所以一維數組轉置後結果不變
ar3 = ar1.reshape(2,5) # 用法1:直接將已有數組改變形狀
ar4 = np.zeros((4,6)).reshape(3,8) # 用法2:生成數組後直接改變形狀
ar5 = np.reshape(np.arange(12),(3,4)) # 用法3:參數內添加數組,目標形狀
print(ar1,'\n',ar3)
print(ar4)
print(ar5)
print('------')
# numpy.reshape(a, newshape, order='C'):為數組提供新形狀,而不更改其數據,所以元素數量需要一致!!
ar6 = np.resize(np.arange(5),(3,4))
print(ar6)
# numpy.resize(a, new_shape):返回具有指定形狀的新數組,如有必要可重復填充所需數量的元素。
# 注意了:.T/.reshape()/.resize()都是生成新的數組!!!
# 數組類型轉換:.astype()
ar1 = np.arange(10,dtype=float)
print(ar1,ar1.dtype)
print('-----')
# 可以在參數位置設置數組類型
ar2 = ar1.astype(np.int32)
print(ar2,ar2.dtype)
print(ar1,ar1.dtype)
# a.astype():轉換數組類型
# 數組堆疊
a = np.arange(5) # a為一維數組,5個元素
b = np.arange(5,9) # b為一維數組,4個元素
ar1 = np.hstack((a,b)) # 注意:((a,b)),這裡形狀可以不一樣
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
a = np.array([[1],[2],[3]]) # a為二維數組,3行1列
b = np.array([['a'],['b'],['c']]) # b為二維數組,3行1列
ar2 = np.hstack((a,b)) # 注意:((a,b)),這裡形狀必須一樣
print(a,a.shape)
print(b,b.shape)
print(ar2,ar2.shape)
print('-----')
# numpy.hstack(tup):水平(按列順序)堆疊數組
a = np.arange(5)
b = np.arange(5,10)
ar1 = np.vstack((a,b))
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
a = np.array([[1],[2],[3]])
b = np.array([['a'],['b'],['c'],['d']])
ar2 = np.vstack((a,b)) # 這裡形狀可以不一樣
print(a,a.shape)
print(b,b.shape)
print(ar2,ar2.shape)
print('-----')
# numpy.vstack(tup):垂直(按列順序)堆疊數組
a = np.arange(5)
b = np.arange(5,10)
ar1 = np.stack((a,b))
ar2 = np.stack((a,b),axis = 1)
print(a,a.shape)
print(b,b.shape)
print(ar1,ar1.shape)
print(ar2,ar2.shape)
# numpy.stack(arrays, axis=0):沿著新軸連接數組的序列,形狀必須一樣!
# 重點解釋axis參數的意思,假設兩個數組[1 2 3]和[4 5 6],shape均為(3,0)
# axis=0:[[1 2 3] [4 5 6]],shape為(2,3)
# 數組拆分
ar = np.arange(16).reshape(4,4)
ar1 = np.hsplit(ar,2)
print(ar)
print(ar1,type(ar1))
# numpy.hsplit(ary, indices_or_sections):將數組水平(逐列)拆分為多個子數組 → 按列拆分
# 輸出結果為列表,列表中元素為數組
ar2 = np.vsplit(ar,4)
print(ar2,type(ar2))
# numpy.vsplit(ary, indices_or_sections)::將數組垂直(行方向)拆分為多個子數組 → 按行拆
# 數組簡單運算
ar = np.arange(6).reshape(2,3)
print(ar + 10) # 加法
print(ar * 2) # 乘法
print(1 / (ar+1)) # 除法
print(ar ** 0.5) # 冪
# 與標量的運算
print(ar.mean()) # 求平均值
print(ar.max()) # 求最大值
print(ar.min()) # 求最小值
print(ar.std()) # 求標准差
print(ar.var()) # 求方差
print(ar.sum(), np.sum(ar,axis = 0)) # 求和,np.sum() → axis為0,按列求和;axis為1,按行求和
print(np.sort(np.array([1,4,3,2,5,6]))) # 排序

numpy的索引和切片

# 基本索引及切片
ar = np.arange(20)
print(ar)
print(ar[4])
print(ar[3:6])
print('-----')
# 一維數組索引及切片
ar = np.arange(16).reshape(4,4)
print(ar, '數組軸數為%i' %ar.ndim) # 4*4的數組
print(ar[2], '數組軸數為%i' %ar[2].ndim) # 切片為下一維度的一個元素,所以是一維數組
print(ar[2][1]) # 二次索引,得到一維數組中的一個值
print(ar[1:3], '數組軸數為%i' %ar[1:3].ndim) # 切片為兩個一維數組組成的二維數組
print(ar[2,2]) # 切片數組中的第三行第三列 → 10
print(ar[:2,1:]) # 切片數組中的1,2行、2,3,4列 → 二維數組
print('-----')
# 二維數組索引及切片
ar = np.arange(8).reshape(2,2,2)
print(ar, '數組軸數為%i' %ar.ndim) # 2*2*2的數組
print(ar[0], '數組軸數為%i' %ar[0].ndim) # 三維數組的下一個維度的第一個元素 → 一個二維數組
print(ar[0][0], '數組軸數為%i' %ar[0][0].ndim) # 三維數組的下一個維度的第一個元素下的第一個元素 → 一個一維數組
print(ar[0][0][1], '數組軸數為%i' %ar[0][0][1].ndim)
# numpy.random.rand(d0, d1, ..., dn):生成一個[0,1)之間的隨機浮點數或N維浮點數組 —— 均勻分布
import matplotlib.pyplot as plt # 導入matplotlib模塊,用於圖表輔助分析
% matplotlib inline
# 魔法函數,每次運行自動生成圖表
a = np.random.rand()
print(a,type(a)) # 生成一個隨機浮點數
b = np.random.rand(4)
print(b,type(b)) # 生成形狀為4的一維數組
c = np.random.rand(2,3)
print(c,type(c)) # 生成形狀為2*3的二維數組,注意這裡不是((2,3))
samples1 = np.random.rand(1000)
samples2 = np.random.rand(1000)
plt.scatter(samples1,samples2)
# 生成1000個均勻分布的樣本值
# 存儲數組數據 .npy文件
import os
os.chdir('C:/Users/Hjx/Desktop/')
ar = np.random.rand(5,5)
print(ar)
np.save('arraydata.npy', ar)
# 也可以直接 np.save('C:/Users/Hjx/Desktop/arraydata.npy', ar)
#%%
# 讀取數組數據 .npy文件
ar_load =np.load('arraydata.npy')
print(ar_load)
# 也可以直接 np.load('C:/Users/Hjx/Desktop/arraydata.npy')
#%%
# 存儲/讀取文本文件
ar = np.random.rand(5,5)
np.savetxt('array.txt',ar, delimiter=',')
# np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# '):存儲為文本txt文件
ar_loadtxt = np.loadtxt('array.txt', delimiter=',')
print(ar_loadtxt)
# 也可以直接 np.loadtxt('C:/Users/Hjx/Desktop/array.txt')

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved