Python進階:NumPy

  • 2019 年 12 月 26 日
  • 筆記

Python本身沒有處理矩陣的數據類型,因此需要使用附件的函數庫。

NumPy(Numerical Python) 是 Python 語言的一個擴展程式庫,支援大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。這種擴展庫可以用來存儲和處理大型多維矩陣,比Python自身的列表結構要高效很多。

NumPy安裝

cmd命令行輸入如下命令:

C:UsersAdministrator>pip install numpyRequirement already satisfied: numpy in d:anaconda3libsite-packages (1.15.4)# 我用的anaconda已經集成安裝了numpy

NumPy的基本使用

  • numpy導入及數組創建
  • 通過shape屬性獲取數組的大小
  • 修改數組的shape屬性

可以通過修改數組的shape屬性,在保持數組元素個數不變的情況下,改變數組每個軸的長度。

下面的例子將數組c的shape改為(4, 3)。注意:從(3, 4)改為(4, 3)並不是對數組進行轉置,而只是改變每個軸的大小,數組元素在記憶體中的位置並沒有改變。

當某個軸的元素為 -1 時,將根據數組元素的個數自動計算此軸的長度,因此下面的程式碼將c的shape改為了(2, 6)。

此外,使用數組的reshape方法,可以創建一個改變了尺寸的新數組,原數組的shape保持不變。

  • 數組的類型

數組元素的類型可以通過dtype屬性獲得,上面例子中的參數序列的元素都是整數,因此所創建的數組的元素類型也是整數,並且是32位的長整型。

可以通過dtype參數在創建時指定元素類型。

可以發現,現在數組元素都是浮點類型。

  • 其他創建數組的方式

前面的例子都是先創建一個Python序列,然後通過array函數將其轉換為數組,這樣做效率較低,NumPy提供 了很多專門創建數組的函數。

1) arange函數類似於Python的range函數,通過指定開始值,終止值和步長來創建一維數組,需要注意的是數組不包含終止值。

2) linspace函數通過指定開始值、終止值和元素個數來創建一維數組,可以通過endpoint關鍵字來指定是否包含終止值,默認包含終止值。

3) logspace函數和linspace類似,但是他創建的是等比數列,下面的例子顯示從2到64有個元素的等比數列。默認開始值和結束值都是10的冪,可以用base = n 修改。

  • 數組元素的存取

數組元組的存取方法與Python的標準方法相同。

  • ufunc運算

ufunc是一種能夠對數組的每個元素進行操作的函數,numpy內置了許多ufunc函數都是在C語言級別實現的,因此,他們的運算速度非常快。請看例子:

可以發現,numpy.sin比math.sin快很多。

  • 矩陣的運算

矩陣的運算可以使用dot函數計算。對於二維數組,它計算的是矩陣乘積,對於一維數組,它計算的是點積。

  • 文件存取

numpy提供多種文件操作函數以方便用戶存取數組內容。文件存取的格式分為兩類,二進位和文本。二進位格式文件又分為numpy專用的格式化二進位類型和無格式化的二進位類型。

可以使用numpy.savetxt和numpy.loadtxt讀寫一維和二維數組。

import numpy as np #生成數據 x = np.arange(1,10,1).reshape(3,-1)   #保存數據 np.savetxt('test.txt', x) # 默認按照'%.18e'格式保存數據(18個0科學計數法),以空格分割np.savetxt('test1.txt', x,fmt='%1.4e') np.savetxt('test2.txt', x, delimiter=',') np.savetxt('test3.txt', x,newline='a') np.savetxt('test4.txt', x,delimiter=',',newline='a') np.savetxt('test5.txt', x,delimiter=',',header='abc') np.savetxt('test6.txt', x,delimiter=',',footer='abc') 

在jupyter nootbook中輸入pwd查看當前目錄,查看生成的7個文件內容差異。

如需查看文件內容,可以使用下面的程式碼:(保存格式不同,查看的程式碼也有差異)

np.loadtxt("test2.txt",delimiter=',')