by 潮汐
上一篇文章中我們詳細介紹了 NumPy 的功能及用途,本章節着重介紹 NumPy 一個神奇的對象 Ndarray 以及 NumPy 資料類型,包括兩者的用途,接下來就開啟神奇之旅吧。
标準安裝的 Python 中用清單 (list) 儲存一組值,它可以用來當作數組使用,不過由于清單的元素可以是任何對象,是以清單中所儲存的是對象的指針。這樣為了儲存一個簡單的[1,2,3],需要有3個指針和三個整數對象。對于數值運算來說這種結構顯然比較浪費記憶體和CPU計算時間。
此外 Python 還提供了一個array子產品,array對象和清單不同,它直接儲存數值,和C語言的一維數組比較類似。但是由于它不支援多元,也沒有各種運算函數,是以也不适合做數值運算。
NumPy 的誕生彌補了這些不足,NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray (下文統一稱之為數組)是存儲單一資料類型的多元數組,而 ufunc 則是能夠對數組進行處理的函數。
NumPy 最重要的一個特點是其 N 維數組對象 ndarray,Ndarray 從名字組成上看是 Nd-array,顧名思義就是 N 維數組的意思,它是一系列多元且同類型資料的集合,以 下标為 0 開始進行集合中元素的索引。ndarray 是記憶體存儲,換言之 ndarray 對象由計算機記憶體的連續一部分組成,并結合索引模式,将每個元素映射到記憶體塊中的一個位置,它比清單存儲節省空間
ndarray 對象是用于存放同類型元素的多元數組。
ndarray 中的每個元素在記憶體中都有相同存儲大小的區域。
一個指向資料(記憶體或記憶體映射檔案中的一塊資料)的指針。
資料類型或 dtype,描述在數組中的固定大小值的格子。
一個表示數組形狀(shape)的元組,表示各次元大小的元組。
一個跨度元組(stride),其中的整數指的是為了前進到目前次元下一個元素需要"跨過"的位元組數。
由以上執行個體可知,建立一個 ndarray 隻需調用 NumPy 的 array 函數即可,如下:
名稱
描述
object
數組或嵌套的數列
dtype
數組元素的資料類型,可選
copy
對象是否需要複制,可選
order
建立數組的樣式,C為行方向,F為列方向,A為任意方向(預設)
subok
預設傳回一個與基類類型一緻的數組
ndmin
指定生成數組的最小次元
值得注意的是:ndmin 預設為數值為 0
建立一個簡單的 ndarray 對象,單維數組
輸出結果如下:
建立一個大于 1 維的數組
使用最小次元參數指定次元
以下執行個體指定數組次元為 2 維,ndmin 預設次元是 0
輸出結果為:
使用 dtype 參數指定數組元素的資料類型
輸出結果:
NumPy 支援的資料類型比 Python 内置的類型要更多,基本上可以和 C 語言的資料類型對應上,其中部分類型對應為 Python 内置的類型。
下表列舉了 NumPy 常用基本資料類型,為了差別于 Python 原生的資料類型,bool、int、float、complex、str 等類型名稱末尾都加了 _。
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,等等。
資料類型對象是用來描述與數組對應的記憶體區域如何使用,這依賴如下幾個方面:
資料的類型(整數,浮點數或者 Python 對象)
資料的大小(例如, 整數使用多少個位元組存儲)
資料的位元組順序(小端法或大端法)
在結構化類型的情況下,字段的名稱、每個字段的資料類型和每個字段所取的記憶體塊的部分
如果資料類型是子數組,它的形狀和資料類型
位元組順序是通過對資料類型預先設定"<"或">"來決定的。"<"意味着小端法(最小值存儲在最小的位址,即低位組放在最前面)。">"意味着大端法(最重要的位元組存儲在最小的位址,即高位組放在最前面)。
dtype 對象是使用以下文法構造的:
object - 要轉換為的資料類型對象
align - 如果為 true,填充字段使其類似 C 的結構體。
copy - 複制 dtype 對象 ,如果為 false,則是對内置資料類型對象的引用
執行個體操作:
執行個體 1
執行個體 2
結構化資料類型的使用,類型字段和對應的實際類型将被建立
執行個體1:建立年齡數組并且應用于 ndarray 對象
執行個體2:定義一個結構化資料類型 student,包含字元串字段 name,整數字段 age,及浮點字段 marks,并将這個 dtype 應用到 ndarray 對象。
字元
對應類型
b
布爾型
i
(有符号) 整型
u
無符号整型 integer
f
浮點型
c
複數浮點型
m
timedelta(時間間隔)
M
datetime(日期時間)
O
(Python) 對象
S, a
(byte-)字元串
U
Unicode
V
原始資料 (void)
numpy 資料類型轉換需要調用方法 astype(),不能直接修改 dtype。調用 astype 傳回資料類型修改後的資料,但是源資料的類型不會變,需要進一步對源資料的指派操作才能改變。
執行個體:
我們把形如 z=a+bi(a, b均為實數)的數稱為複數,其中 a 稱為實部,b 稱為虛部,i 稱為虛數機關。
當虛部 b=0 時,複數 z 是實數; 當虛部 b!=0 時,複數 z 是虛數; 當虛部 b!=0,且實部 a=0 時,複數 z 是純虛數。
輸出:
如上輸出結果就是複數形式的資料類型
本章節是對 NumPy Ndarray 對象及 NumPy 資料類型的用法作詳細介紹,本文介紹的是 Ndarray 基礎知識,等把 NumPy 所有知識點介紹完後會出一個項目實戰那,更好的給運用 NumPy 相關知識點的友人們提供支撐。
https://www.runoob.com/numpy/numpy-ndarray-object.html
https://www.runoob.com/numpy/numpy-dtype.html
文中示例代碼:python-100-days
關注公衆号:python技術,回複"python"一起學習交流

作者:純潔的微笑
出處:www.ityouknow.com
資源:微信搜【純潔的微笑】關注我,回複 【程式員】【面試】【架構師】有我準備的一線程式必備計算機書籍、大廠面試資料和免費電子書。 一共1024G的資料,希望可以幫助大家提升技術和能力。
本文如對您有幫助,還請多幫 【推薦】 下此文。
點我了解:Tooool-程式員一站式導航網站