numpy庫的使用

爲什麼要引入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爲多維 返回每個維度得梯度
連續值之間的變化率 就是斜率

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