目錄
數據分析,作爲大數據時下比較火的行業,想要轉行從事相關工作的人很多很多,那麼在工作中絕對繞不過的三個包是numpy、scipy和pandas。numpy是Python的數值計算擴展,專門用來處理矩陣,它的運算效率比列表更高效。scipy是基於numpy的科學計算包,包括統計、線性代數等工具。pandas是基於numpy的數據分析工具,能更方便的操作大型數據集,那麼什麼是numpy呢?它又是如何使用的呢?
一、Numpy 介紹
NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協作者共同開發,2005 年,Travis Oliphant 在 Numeric 中結合了另一個同性質的程序庫 Numarray 的特色,並加入了其它擴展而開發了 NumPy。NumPy 爲開放源代碼並且由許多協作者共同維護開發。
NumPy 是一個運行速度非常快的數學庫,主要用於數組的計算,包含:
- 一個強大的N維數組對象 ndarray
- 廣播功能函數
- 整合C/C++/Fortran 代碼的工具
- 線性代數、傅里葉變換、隨機數生成等功能
二、NumPy 的應用
NumPy 通常與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用, 這種組合廣泛用於替代 MatLab,是一個強大的科學計算環境,有助於我們通過 Python 學習數據科學或者機器學習。
SciPy 是一個開源的 Python 算法庫和數學工具包。
SciPy 包含的模塊有最優化、線性代數、積分、插值、特殊函數、快速傅里葉變換、信號處理和圖像處理、常微分方程求解和其他科學與工程中常用的計算。
Matplotlib 是 Python 編程語言及其數值數學擴展包 NumPy 的可視化操作界面。它爲利用通用的圖形用戶界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 嚮應用程序嵌入式繪圖提供了應用程序接口(API)。
學習鏈接
- NumPy 官網 http://www.numpy.org/
- NumPy 源代碼:https://github.com/numpy/numpy
- SciPy 官網:https://www.scipy.org/
- SciPy 源代碼:https://github.com/scipy/scipy
- Matplotlib 官網:https://matplotlib.org/
- Matplotlib 源代碼:https://github.com/matplotlib/matplotlib
三、Numpy 中的 Ndarray對象
ndarray:他是一系列同類型數據的集合,以0位下標開始進行集合中元素的索引。
ndarray 對象是用於存放同類型元素的多維數組
ndarray 中每個元素在內存中都有相同存儲大小的區域
ndarray 內部由以下內容組成:
- 一個指向數據(內存或內存映射文件中的一塊數據)的指針。
- 數據類型或者dtype,描述在數組中的固定大小值的格子。
- 一個表示數組形狀(shape)的元組,表示各維度大小的元組。
- 一個跨度元組(stride),其中的整數指的是爲了前進到當前維度下一個元素需要 “跨過” 的字節數。
1、ndarray 的內部結構
其中的跨度可以是負數,這樣會使數組在內存中向後移動,比如切片obj[ : :-1]
或者 obj[:, :: -1]
就是如此。
2、創建ndarray對象:
import numpy as np
np.array(object, dtype = None, copy = True, order = None, subok = Fasle, ndmin = 0)
參數說明:
名稱 | 描述 |
---|---|
object | 數組或嵌套的數列 |
dtype | 數組元素的數據類型,可選 |
copy | 對象是否需要複製,可選 |
order | 創建數組的樣式,C爲行方向,F爲列方向,A爲任意方向(默認) |
subok | 默認返回一個與基類類型一致的數組 |
ndmin | 指定生成數組的最小維度 |
實例:
import numpy as np
#eg_1 單維度
a = np.array([1, 2, 3])
print(a)
#結果爲 : [1,2,3]
#eg_2 多維度
a = np.array([[1, 2], [3, 4]])
print(a)
'''
結果爲:[[1,2]
3,4]]
'''
#eg_3 最小維度
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print(a)
'''
結果爲: [[1, 2, ]] 指定爲2個維度
'''
#eg_4 dtype參數
a = np.array([1, 2, 3], dtype = complex)
print(a)
'''
結果爲:[1. + 0.j, 2. + 0j, 3. + 0j]
'''
ndarray 對象是由計算機內存的連續一維部分組成,並結合索引模式,將每個元素映射到內存塊中的一個位置。內存塊以行順序或者列順序來保存元素。
四、NumPy 數據類型
numpy 支持的數據類型比 Python 內置的類型要多很多,基本上可以和 C 語言的數據類型對應上,其中部分類型對應爲 Python 內置的類型。
常用 NumPy 基本類型
名稱 | 描述 |
---|---|
bool_ | 布爾型數據類型(True 或者 False) |
int_ | 默認的整數類型(類似於 C 語言中的 long,int32 或 int64) |
intc | 與 C 的 int 類型一樣,一般是 int32 或 int 64 |
intp | 用於索引的整數類型(類似於 C 的 ssize_t,一般情況下仍然是 int32 或 int64) |
int8 | 字節(-128 to 127) |
int16 | 整數(-32768 to 32767) |
int32 | 整數(-2147483648 to 2147483647) |
int64 | 整數(-9223372036854775808 to 9223372036854775807) |
uint8 | 無符號整數(0 to 255) |
uint16 | 無符號整數(0 to 65535) |
uint32 | 無符號整數(0 to 4294967295) |
uint64 | 無符號整數(0 to 18446744073709551615) |
float_ | float64 類型的簡寫 |
float16 | 半精度浮點數,包括:1 個符號位,5 個指數位,10 個尾數位 |
float32 | 單精度浮點數,包括:1 個符號位,8 個指數位,23 個尾數位 |
float64 | 雙精度浮點數,包括:1 個符號位,11 個指數位,52 個尾數位 |
complex_ | complex128 類型的簡寫,即 128 位複數 |
complex64 | 複數,表示雙 32 位浮點數(實數部分和虛數部分) |
complex128 | 複數,表示雙 64 位浮點數(實數部分和虛數部分) |
NumPy 的數值類型實際上是 dtype 對象的實例,並對應唯一的字符,包括 np.bool_,np.int32,np.float32,等等
1、數據類型對象(dtype)
數據類型對象是用來描述與數組對應的內存區域如何使用,這依賴如下幾個方面:
-
數據的類型(整數、浮點數、或者Python對象)
-
數據的大小(例如 整數使用了多少個字節存儲)
-
數據的字節順序(小端法或大端法)
-
在結構化類型的情況下,字段的名稱、對每個字段的數據類型和每個字段所取的內存塊的部分
-
如果數據類型是子數組,它的形狀和數據類型字節順序是通過數據類型預先設定 ’ < ‘ 或者 ’ > ’ 來決定的。
- ’ < ‘ 意味着小端法(最小值存儲在最小的地址,即低位組放在最前面)。
- ’ > '意味着大端法(最重要的字節存儲在最小的地址,即高位組放在最前面)。
2、創建 dtype 對象
import numpy as np np.dtype(obiect, align, copy)
參數說明:
名稱 | 描述 |
---|---|
object | 要轉換爲的數據類型對象 |
align | 如果爲True,填充字段使其類似C的結構體 |
copy | 複製dtype對象,如果爲False,則是對內置數據類型對象的引用 |
實例:
import numpy as np
#eg_1 使用標量類型
dt = np.dtype(np.int32)
print(dt)
'''
輸出結果爲: int32
'''
#eg_2
'''
四種數據類型可以使用字符串來代替:
int8, int16, int32, int64
'i1', 'i2', 'i4', 'i8'
'''
dt = np.dtype('i4')
print(dt)
'''
輸出結果爲:int32
'''
#eg_3 字節順序標註
dt = np.dtype('<i4')
print(dt)
'''
輸出結果爲:int32
'''
#eg_4 下面的例子展示結構化數據類型的使用,類型字段和對應的實際類型將被創建
#創建結構化數據類型
dt = np.dtype([('age',np.int32)])
print(dt)
'''
輸出結果爲:[('age', 'i1')]
'''
#將數據類型應用於 ndarray 對象
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a)
'''
輸出結果爲:([(10,), (20,), (30,)]
'''
# 類型字段名可以用於存取實際的 age 列
dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print(a)
print(a['age'])
'''
輸出結果爲:[(10,) (20,) (30,)]
[10 20 30]
'''
#eg_5 該實例將定義一個結構化類型 student, 包含字符串字段 name, 整數字段 age,以及浮點數字段 marks,並將這個 dtype 應用到 ndarray 對象
student = np.dtype([('name','S20'),('age','i1'),('marks','f4')])
print(student)
'''
輸出結果爲:[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
'''
每一個內建類型內部都有一個唯一定義它的字符代碼:
字符 | 對應類型 |
---|---|
b | 布爾型 |
i | (有符號) 整型 |
u | 無符號整型 integer |
f | 浮點型 |
c | 複數浮點型 |
m | timedelta(時間間隔) |
M | datetime(日期時間) |
O | (Python) 對象 |
S, a | (byte-)字符串 |
U | Unicode |
V | 原始數據 (void) |
希望本文對初學者有所幫助,本文將持續更新,在後面各位讀者將會看到更多Numpy應用,以及Python數據分析的三劍客之二 潘大師(pandas) 的出現,如果錯誤或不足之處,還請各位讀者指出,感謝閱讀!