爲什麼要引入numpy庫?
numpy 把一個數組 當作一個數據來進行計算,可以去掉元素之間所需要的循環 使得一維數組當作一個數據單元。 底層是基於C語言的,計算速度較快。
def npsum():
a = np.array([0,1,2,3,4,5]);
b = np.array([2,3,43,1,2,2]);
c = a**2+b**3;
return c;
print(npsum());
numpy數組的幾個特性
- a.ndim 是維度
- a.size 是元素個數
- a.shape 是尺寸 是什麼形狀
- a.dtype 對象的元素類型
- a.itemsize 每個元素佔幾個字節
代碼:
a=np.array([[1,2,3,4],[21,23,23,43]],dtype = 'int64');
print("維度 ",a.ndim);
print("元素個數 ",a.size);
print("數組形狀 ",a.shape);
print("數組元素類型 ",a.dtype);
print("每個元素佔幾個字節 ",a.itemsize);
結果:
ndarray支持的數據類型
-
ndarray 支持的數據類型
bool True False
int16
int32
int64 -
uint8
uint16
uint32
uint64 -
float16
float21
float64 -
複數
complex64 實部虛部都是32位浮點數
complex128 …64…
- 爲什麼ndaary要支持這麼多的元素類型
科學計算涉及到大量數據類型,對類型進行精確的定義,有利於合理使用存儲空間並優化性能,有利於程序員對程序規模預估。
b = np.array([[1,2,3,4],[12,3,21,2,21]]);
print(b.shape);
print(b.dtype)
print(b.ndim)
- 非同質的ndarray求shape只能顯示維度,dtype輸出的是一個object
看作一個一維的 ,每一個對象都是一個object(可以理解爲類)
數組的創建方法
-
1、從列表中創建
x=[1,2,3,4,5];
np.array(x); -
2、用創建函數
np.arange(n) 生成(0-n-1)整數類型
np.ones(shape) 生成一個全1 shape是元組()
np.zeros(shape);
np.full(shape,val);
np.eye(n) 單位矩陣np.ones_like(a) 跟a一樣的全1
np.zeros_like(a)
np.full_like(a,val);np.linspace(a,b,c) [a,b]按相同間距取c個
np.concatenate() 將兩個或者多個數組合並
xx.reshape((a,b)) 改變形狀
代碼:
a = np.arange(10)
b = np.ones((6,4),dtype='int32');
c = np.full((2,3),4);
d = np.eye(5,dtype='int32');
print("a\n",a);
print("b\n",b);
print("c\n",c);
print("d\n",d);
e = np.full_like(b,10);
print("e\n",e);
f = np.linspace(1,10,20);
print("f\n",f)
b.reshape((2,12));
print("b\n",b);
-
xx.reshape(shape); 不改變原數組
xx.resize(shape); 改變原數組
xx.swapaxes(ax1,ax2) 對兩個維度進行換
xx.flatten() -
xx.astype(nwe_type) 改變數據類型
//可以用該方法來實現數組的拷貝// -
xx.tolist() 把數組變成一個列表
對ndarray數組的操作
- 1、索引
一維數組的索引: 類似於C語言的索引 從左往右從0開始 負數從右向左遞減-1表示倒數第一個
多維數組的索引: a[one,two,three…] 用,分隔 - 2、切片
一維數組的切片: [s:e:step] [s開始編號,e終止) step表示步長
多維數組的切片: [s1:e1:step1,s2:e2:step2,s3:e2]
可以用一個:表示整個維度[:,:,s1:e1,::2];
步長可以是負數 [::-1] 字符串的反向輸出
#一維
a = np.array([1,2,3,4,3]);
print(a[2]);
print(a[-2]);
print(a[0:4:2])
#多維
b = np.arange(24).reshape((2,3,4));
print(b);
print(b[1,2,3])
print("切片\n",b[:,1:3,:])
ndarray的計算
- 1、數組與標量運算 是數組中的每個元素都和這個標量進行運算。
- 2、函數 都是對數組中的每個元素進行操作 (不改變原數組)
np.abs(x) np.fabs(x) 絕對值
np.sqrt(x) 開方
np.square(x) 求平方
np.log(x) np.log10(x) np.log2(x); 取對數
np.ceil(x) 向上取整
np.rint(x) 四捨五入
np.modf(x) 返回小數和整數
np.cos(x) np.cosh(x); 三角函數
np.sin(x) np.sish(x);
np.exp(x) 指數
np.sigh(x) 符號 1(+) 0(0) -1(-)
np.maximunm(x,y) np.fmax(); 取x,y中的較大值
np.minimun(x,y)
np.mod(x,y) 模運算
np.copysigh(x,y)將y中的符號給x
> < == <= <=等運算
代碼:
a = np.arange(24).reshape((2,3,4));
a = a/a.mean();
print(a);
print(np.ceil(a))
文件操作
- CSV文件存儲(只能有效的存儲一維和二維數組)類似的文本文件,不同於txt
- np.savetxt(路徑,數組名,fmt=’%d%f’,delimiter=‘分隔字符’)
- b = np.loadtxt(frame,dtype=np.int,delimiter=“分隔字符”,unpack=false(是寫入一個數組中))
import numpy as np;
a = np.arange(100).reshape(5,20)
np.savetxt("a.csv",a,fmt='%d',delimiter=',');
b= np.loadtxt("a.csv",dtype = np.int,delimiter=',');
print(b);
多維數據的存取
- 存:
a.tofile(frame,sep=’’,format=’%s’);
fram 名字
sep 分隔符 沒有sep是一個二進制文件。
format 格式 - 取:
np.fromfile(fram,dtype=np.int,count=-1,sep=’’);
count:讀入的個數
用這種方法讀取會丟失維度信息。所以在讀入時需要知道數組的維度和元素的類型。
可以通過元數據文件存儲這個數組的信息。
a = np.arange(100).reshape(5,10,2);
a.tofile("aa.dat",sep=',',format='%d')
b = np.fromfile("aa.dat",dtype =np.int,sep=',');
print(b);
np.save(frame,array);
frame 文件名 以.npy爲擴展名 壓縮擴展名.mpz
array 數組的名
np.load(fname)
frame 文件名
可以保存數組的類型和數組的形狀。是一個很好用的方法。而且參數很少,只有兩個參數。
a = np.arange(100).reshape(5,2,10);
np.save("aaa.npy",a);
b = np.load("aaa.npy");
print(b);
所以,如果不介意保存爲.py文件的話,用np.load() 和np.save()是更好的選擇。
numpy的隨機函數庫
np.random()的函數
-
rand(d0,d1,dn) 根據維度,浮點數[0,1]均勻分佈
randn(d0,d1,dn) 標準正態分佈
randint(low,high,(x,y)); 均勻分佈,指定上下限 (low,high)
np.randseed() 生成隨機數種子 以時間作爲種子 -
shuffle(a) 根據數組a的第一軸進行隨機排列,改變數組a
permutation(a) 根據數組a的第一軸進行隨機排列,不改變數組a
choice(a,[,size,replace,p]) 從a中概率p抽取元素,replace是不是可放回抽取 -
uniform(low,high,size) 具有均勻分佈,size形狀
normal(loc,scale,size) loc均值,scale方差 size形狀 正態分佈 -
統計函數
sum(a,axis=None) 求和
mean(a,axis=none) 求平均值
average(a,axis,weights=None) 加權平均值
std(a,axis=None) 求標準差
var(a,axis=None) 方差
min(a) max(a)
argmin(a) argmax(a) 最值得下標
unravel_index(index,shape) 根據shape
median
ptp 最大最小之差
axis表示的第幾維度
a = np.arange(30).reshape(3,10);
print(a);
print(np.sum(a,axis=0));
nmpy的梯度函數
np.gradient(f)
f爲多維 返回每個維度得梯度
連續值之間的變化率 就是斜率