【python】 Numpy介紹與使用

0 前言   

一維數據一般採用線性方式表示,可以是有序或者無序的。
列表和數組都可以表示一組數據的有序結構,但是列表元素類型可以不同,數組元素類型需要相同。

列表元素數據類型可以不同:

[“1”,“2”,“str”,“4”,“pi”]

數組數據類型要相同。

二維數據是一維數據的多個組合形式。表格是典型的二維數據。

多維數據由一維或二位在新的維度上組合,如時間維度。比如去年的表格和今年的表格存在時間維度的差別。

高維數據:一般由鍵值對將數據組織表示出來。

{

“姓名”:“lol”,

“年齡”:“18”,

“學習經歷”:{

     “小學”:“xx小學”,

     “中學”:“xx中學”,

     “大學”:“xx大學”

     },

}

python中數據的表示形式:

一維:列表 [有序] 和集合 {無序} 類型。
二維、多維數據多用列表[ ]類型表示。

[ [0, 1, 2],
  [3, 4, 5] 
]
 #二維數據,形狀(2,3)

三維數據,數據形狀(2,3,4)

[ [ [ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11] ],
    
  [ [12, 13, 14, 15],
    [16, 17, 18, 19],
    [20, 21, 22, 23] ]
]

高維數據:字典 { } 或其他數據表示格式(json,xml等)。

1 numpy數據類型ndarray介紹

開源python科學計算基礎庫,可以進行快速的數組運算。降低傳統數組運算時循環需要的時間,節省運算和存儲空間。
數組類型爲ndarray 對象。
使用前先安裝:

pip install numpy

一般引用方法:

import numpy as np
np是別名可以自己設置,爲了節省代碼量增加可讀性一般最好和大家統一

1.1array數組介紹及基本屬性

ndarray數據類型不僅包含實際的數據,還有描述數據的一些詳細信息,如數據類型,維度,結構等等。
ndarray(shape, dtype=float, buffer=None, offset=0,strides=None, order=None)

shape:tuple of ints,Shape of created array.爲元組型數值,表示創建的array形狀。
dtype=float:data-type, optional,創建的numpy數組的數據類型,可選參數。
buffer:object exposing buffer interface, optional,數據接口,可以在創建array時填充數據
offset:Offset of array data in buffer.填充數據的偏移。
strides:Strides of data in memory.
order:數據排布格式,行形式或者列形式, {‘C’, ‘F’}, optional

在numpy程序中ndarray就是array。
array數組的軸(axis):數據的維度
秩(rank):表示數據維度的數量。
array對象的常用屬性:

屬性 說明
.T Transpose of the array.數組的轉置
.ndim 秩,多維數組維度的值
.shape 對象的度量尺度,如(m,n)表示矩陣m行n列
.size array對象中元素的個數相當於shape中的乘積
.dtype array對象的元素類型,可設置
.itemsize 數組對象中每個元素的大小,以字節爲單位,如dtype=int32型表示4字節

示例:

import numpy as np
a = ([2,5,3,8],[1,4,7,6])
b = np.arange(24).reshape((2,3,4))

print(a) #此處a是tuple()類型
([2, 5, 3, 8], [1, 4, 7, 6])

a = np.array(a)
print(a) #這裏a纔是numpy的array類型
[[2 5 3 8]
 [1 4 7 6]]

print(b) #b是三維的數據
[	[[ 0  1  2  3]
  	 [ 4  5  6  7]
  	 [ 8  9 10 11]]

 	[[12 13 14 15]
  	 [16 17 18 19]
  	 [20 21 22 23]]	]

常用屬性:

a = np.array([[1,2,4],[2,3,6]])

a
Out[3]: 
array([[1, 2, 4],
       [2, 3, 6]])

a.T  #轉置
Out[4]: 
array([[1, 2],
       [2, 3],
       [4, 6]])

a.ndim  #維度
Out[5]: 2

a.shape  #形狀,返回元組
Out[6]: (2, 3)

a.size  #數據量
Out[7]: 6

a.dtype  #數據類型
Out[8]: dtype('int32')

a.itemsize   #單個數據佔用大小
Out[9]: 4

你可以在IPython編輯區內對變量或者函數輸入 函數/變量? 查看其詳細屬性。np.ndarray? 可以查看ndarray數組的詳細屬性。a?查看變量的屬性。

a?
Type: ndarray
String form:
[[2 5 3 8]
[1 4 7 6]]
Length: 2
File: d:\pyrelated\anaconda\lib\site-packages\numpy_init_.py
… … … .

使用array創建的數組元素默認是float型,可以進行更改。

1.2 array數組中的數據類型

array數組在創建時有個參數dtype是可以設置的,默認的是float,可能會根據數據量自動調整具體類型,numpy裏面的數據類型非常的詳細,是爲了合理使用存儲空間空間、評估程序規模提高程序運行速度等。
數據類型有:

bool, intc, intp, int8, int16, int32, int64, uint8, uint16, uint32, uint64,float16, float32, float64, complex64, complex128 複數 img + real

1.3 創建array數組

(1)利用python中的列表[]和元組()創建ndarray數組。x = np.array(lis/tuple)

a = [[1,2],[3,4]]  #列表
b = ([5,6],[7,8])  #元組

type(a)
Out[19]: list
type(b)
Out[20]: tuple

c = np.array(a)  #轉化爲array數組
d = np.array(b)

c
Out[23]: 
array([[1, 2],
       [3, 4]])
d
Out[24]: 
array([[5, 6],
       [7, 8]])

創建時數據類型還可以指定,之前介紹過array()的一些參數。不指定類型的時候可以根據數據情況自動關聯一個dtype類型。

e = np.array(a,dtype=np.int64)  #自定義數據類型

d.dtype
Out[27]: dtype('int32')
e.dtype
Out[28]: dtype('int64')

(2)使用numpy中的函數創建ndarray數組。

函數 說明
arange(n) 生成0-n-1數值的ndarray
ones(shape) 生成一個全是1的形狀爲shape的數組
zeros(shape) 生成全是0的,shape是表示大小的元組()
full(shape,val) 生成一個大小是shape,值是val的數組
eye(n) 生成正方形n的單位矩陣
ones_like(a) 根據數組a的形狀生成全是1的
zeros_like(a) 根據a生成全是0的
full_like(a,val) 根據a的聲稱全是值val的數組

示例:

a = np.arange(4)   #一維數組
b = np.ones((2,2))  #全1數組
c= np.zeros((2,3))    #全0數組
d = np.full((3,3),6)   #使用定值生成數組
e = np.eye(4)    #單位矩陣

a
Out[39]: array([0, 1, 2, 3])
b
Out[40]: 
array([[ 1.,  1.],
       [ 1.,  1.]])
c
Out[41]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
d
Out[42]: 
array([[6, 6, 6],
       [6, 6, 6],
       [6, 6, 6]])
e
Out[43]: 
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

f = np.ones_like(d)  #以數組d的格式作爲參考,生成新的值是1的數組
g = np.zeros_like(d)
h = np.full_like(d,8)

f
Out[51]: 
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
g
Out[52]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])
h
Out[53]: 
array([[8, 8, 8],
       [8, 8, 8],
       [8, 8, 8]])

(3)其他函數創建。
np.linspace(A,B,C) 在AB間均勻取C個數據,其他參數np.linspace?查看

np.linspace(2.0, 3.0,5)    #生成線性值
Out[55]: array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])

np
np.concatenate(a,b) 合併多個數組

a = np.linspace(2.0, 3.0,5)
b = np.arange(4)
c = np.concatenate((a,b))  #合併數組,其他參數help查看文檔

c
Out[78]: array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ,  0.  ,  1.  ,  2.  ,  3.  ])

2 array 數組的變換

生成的array數組可以進行維度和元素類型的變換。

2.1 維度變換

常用方法 說明
.reshape(shape) 不修改元素,新生成shape形狀數組,原數組也不改變
.resize(shape) 在原數組基礎上直接修改shape形狀
.flatten() 降維處理,整理新生成一維數組
a = np.arange(24).reshape((2,3,4))
Out[127]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

a.reshape((2,4,3))   #使用reshape時原來的數組a不會變化,會新生成一個
Out[128]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]]])
        
a.resize((4,3,2))    #使用resize就會改變原來a的形狀
print(a)
[[[ 0  1]
  [ 2  3]
  [ 4  5]]

 [[ 6  7]
  [ 8  9]
  [10 11]]

 [[12 13]
  [14 15]
  [16 17]]

 [[18 19]
  [20 21]
  [22 23]]]
  
print(a.flatten())  #降維,平整爲一維數據
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

2.2 array數組類型的變換

(1)array 的數據類型變化。
設a爲一個array數組。
b = a.astype(newtype)
使用a.astype()的時候相當於新複製了一個數組,然後進行改變。

 a = np.arange(5)

a.dtype
Out[134]: dtype('int32')

a.astype(np.float)
Out[135]: array([ 0.,  1.,  2.,  3.,  4.])

(2)array 數組轉爲列表
轉化爲列表會比numpy數組慢很多,除非有特殊要求,不建議使用。

a
array([[0, 1, 2],
       [3, 4, 5]])

a.tolist()
Out[138]: [[0, 1, 2], [3, 4, 5]]

3 numpy數組的索引和切片

索引:獲取指定位置的數據元素
切片:獲取數據元素子集

3.1 一維索引切片:

直接通過 a[x],a[A:B:C] 獲取

array([0, 1, 2, 3])

a[1]
Out[141]: 1
a[0:2:1]
Out[142]: array([0, 1])

3.2 多維索引切片

可以將多維數據的每一個維度按一維形式切片索引即可

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])

a[:,1,2]  #第一個維度取全部,第二個維度取第2個位置,第三個維度取第3個位置
Out[4]: array([ 5, 14])

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
a[[1,2],[0,1]]  #先在第一個維度取2,3行,第二個維度取1,2列
Out[7]: array([3, 7])

4 np.random 隨機數生成函數

np.random.rand()和np.random.randn()使用類似,生成正態分佈隨機樣本數組。

()裏面沒有參數時返回一個浮點數
(X)有一個參數時,返回秩是1,長度是X的數組
(2,3)兩個參數時,表示對應形狀的隨機數組,和np.random.standard_normal()功能一樣,只不過它需要輸入元組((2,3))

rand()生成的在0-1之間,randn()沒有限制數據樣本區間。

np.random.randint()生成隨機整數。

randint(low, high=None, size=None, dtype=‘l’)
指定區間、數量、類型

np.random.random(size)只能生成隨機數。

size表示個數。

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