Python 機器學習庫 NumPy 教程


0 Numpy簡單介紹

Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似於矩陣的表示形式,不過numpy為我們提供了更多的函數。如果接觸過matlab、scilab,那么numpy很好入手。

NumPy函數庫中存在兩種不同的數據類型(矩陣matrix和數組array),都可以用於處理行列表示的數字元素。調用mat()函數可以將數組轉化為矩陣,輸入命令如下:

np.mat(np.random.rand(1,4))

1 安裝

pip install numpy

在NumPy中,維度稱之為axis(復數是axes),維度的數量稱之為rank

(通用做法import numpu as np 簡單輸入)

2 多維數組

NumPy的數組類是ndarray,它有一個別名是 numpy.array,但這與Python標准庫的array.array並不一樣。后者僅僅是一個一維數組。而ndarray具有以下的屬性:

  • ndarray.ndim:數組的維數。在Python世界中,維數稱之為rank
  • ndarray.shape:數組的維度。這是一系列數字,長度由數組的維度(ndim)決定。例如:長度為n的一維數組的shape是n。一個n行m列的矩陣的shape是n,m
  • ndarray.size:數組中所有元素的數量
  • ndarray.dtype:數組中元素的類型,例如numpy.int32numpy.int16或者numpy.float64
  • ndarray.itemsize:數組中每個元素的大小,單位為字節
  • ndarray.data:存儲數組元素的緩沖。通常我們只需要通過下標來訪問元素,而不需要訪問緩沖

以list或tuple變量為參數產生一維數組:

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

np.array((1.2,2,3,4))  

以list或tuple變量為元素產生二維數組或者多維數組:

np.array(((1,2,3),(4,5,6)))  

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

我們也可以在創建數組的時候,指定元素的類型,例如這樣:

np.array([[1,2],[3,4]], dtype=complex )

可以使用astype轉換類型,在處理文件時候這個會很實用,注意astype 調用會返回一個新的數組,也就是原始數據的一份拷貝。

numeric_strings2 = np.array(['1.23','2.34','3.45'],dtype=np.string_)
print(numeric_strings2)
[b'1.23' b'2.34' b'3.45']

t=numeric_strings2.astype(float)
print(t)
[ 1.23  2.34  3.45]

3 numpy索引(index)與切片(slicing)

  • index 和slicing :第一數值類似數組橫坐標,第二個為縱坐標;
x=np.array(((1,2,3,4),(5,6,7,8),(9,10,11,12)))
y=x[:,1]
y[0]=20
print(y)
print(x)

結果:

 

通過上面可以發現改變y會改變x ,因而我們可以推斷,y和x指向是同一塊內存空間值,系統沒有為y 新開辟空間把x值賦值過去。

arr = np.arange(10)
arr[3:6]=10
print(arr)

結果:

 

思考為什么這么設計? Numpy 設計是為了處理大數據,如果切片采用數據復制話會產生極大的性能和內存消耗問題。

  •  假如說需要對數組是一份副本而不是視圖可以如下操作:
arr = np.arange(10) 
arr_copy = arr[3:6].copy() 
print(arr_copy)
arr_copy[:]=24 
print(arr_copy)
print(arr)

結果:

 

  • 再看下對list 切片修改(這里設計到python 中深淺拷貝,其中切片屬於淺拷貝):
l=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
l[5:8] = 12 #報錯 TypeError: can only assign an iterable
print(l)
l1= l[5:8]
print(l1)
l1[0]=12 
print(l1)
print(l)

結果:

 

4 多維數組索引(index)、切片(slicing)

arr2d = np.arange(1,10).reshape(3,3)
print(arr2d)
print(arr2d[2])
print(arr2d[0][2])
print(arr2d[0,2])

結果:

 

5 基本的矩陣運算

轉置:

a = np.array([[1,0],[2,3]])
print(a)
print()
print(a.transpose())

結果:

 

特征值、特征向量:

 

 

6 Shape與操作

除了生成數組之外,當我們已經持有某個數據之后,我們可能會需要根據已有數組來產生一些新的數據結構,這時候我們可以使用下面這些函數:

  • reshape:根據已有數組和指定的shape,生成一個新的數組
  • vstack:用來將多個數組在垂直(v代表vertical)方向拼接(數組的維度必須匹配)
  • hstack:用來將多個數組在水平(h代表horizontal)方向拼接(數組的維度必須匹配)
  • hsplit:用來將數組在水平方向拆分
  • vsplit:用來將數組在垂直方向拆分

7 特定array的創建

 

在實際上的項目工程中,我們常常會需要一些特定的數據,NumPy中提供了這么一些輔助函數:

  • zeros:用來創建元素全部是0的數組
  • ones:用來創建元素全部是1的數組
  • empty:用來創建未初始化的數據,因此是內容是不確定的
  • arange:通過指定范圍和步長來創建數組
  • linespace:通過指定范圍和元素數量來創建數組
  • random:用來生成隨機數

 

參考:

numpy 基礎入門 - 30分鍾學會numpy 

Python 機器學習庫 NumPy 教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM