上一篇文章中咱們詳細介紹了 NumPy 的功能及用途,本章節着重介紹 NumPy 一個神奇的對象 Ndarray 以及 NumPy 數據類型,包括二者的用途,接下來就開啓神奇之旅吧。html
標準安裝的 Python 中用列表 (list) 保存一組值,它能夠用來看成數組使用,不過因爲列表的元素能夠是任何對象,所以列表中所保存的是對象的指針。這樣爲了保存一個簡單的[1,2,3],須要有3個指針和三個整數對象。對於數值運算來講這種結構顯然比較浪費內存和CPU計算時間。python
此外 Python 還提供了一個array模塊,array對象和列表不一樣,它直接保存數值,和C語言的一維數組比較相似。可是因爲它不支持多維,也沒有各類運算函數,所以也不適合作數值運算。數組
NumPy 的誕生彌補了這些不足,NumPy提供了兩種基本的對象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray (下文統一稱之爲數組)是存儲單一數據類型的多維數組,而 ufunc 則是可以對數組進行處理的函數。ide
NumPy 最重要的一個特色是其 N 維數組對象 ndarray,Ndarray 從名字組成上看是 Nd-array,顧名思義就是 N 維數組的意思,它是一系列多維且同類型數據的集合,以 下標爲 0 開始進行集合中元素的索引。ndarray 是內存存儲,換言之 ndarray 對象由計算機內存的連續一部分組成,並結合索引模式,將每一個元素映射到內存塊中的一個位置,它比列表存儲節省空間函數
from numpy import *eye(4)Out[3]: array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
由以上實例可知,建立一個 ndarray 只需調用 NumPy 的 array 函數便可,以下:ui
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名稱 | 描述 |
---|---|
object | 數組或嵌套的數列 |
dtype | 數組元素的數據類型,可選 |
copy | 對象是否須要複製,可選 |
order | 建立數組的樣式,C爲行方向,F爲列方向,A爲任意方向(默認) |
subok | 默認返回一個與基類類型一致的數組 |
ndmin | 指定生成數組的最小維度 |
值得注意的是:ndmin 默認爲數值爲 0spa
建立一個簡單的 ndarray 對象,單維數組3d
import numpy as np a = np.array([1,2,3]) print (a)
輸出結果以下:指針
[1 2 3]
建立一個大於 1 維的數組code
import numpy as np a = np.array([[1, 2], [3, 4]]) print (a)
輸出結果以下:
[[1 2] [3 4]]
使用最小維度參數指定維度
如下實例指定數組維度爲 2 維,ndmin 默認維度是 0
import numpy as np a = np.array([1, 2, 3,4,5], ndmin = 2) print (a)
輸出結果爲:
[[1, 2, 3, 4, 5]]
使用 dtype 參數指定數組元素的數據類型
import numpy as np a = np.array([1, 2, 3], dtype = complex) print (a)
輸出結果:
[1.+0.j 2.+0.j 3.+0.j]
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,等等。
數據類型對象是用來描述與數組對應的內存區域如何使用,這依賴以下幾個方面:
字節順序是經過對數據類型預先設定"<"或">"來決定的。"<"意味着小端法(最小值存儲在最小的地址,即低位組放在最前面)。">"意味着大端法(最重要的字節存儲在最小的地址,即高位組放在最前面)。
dtype 對象是使用如下語法構造的:
numpy.dtype(object, align, copy)
實例操做:
實例 1
import numpy as np# 使用標量類型da = np.array([1, 2, 3])print(da.dtype)
輸出結果爲:
int32
實例 2
import numpy as np# int8, int16, int32, int64 四種數據類型可使用字符串 'i1', 'i2','i4','i8' 代替dt = np.dtype('i4')print(dt)
輸出結果爲:
int32
結構化數據類型的使用,類型字段和對應的實際類型將被建立
實例1:建立年齡數組而且應用於 ndarray 對象
da = np.dtype(np.int64)print(da)
# 建立dt = np.dtype([('age',np.int8)])print(dt)
輸出結果爲:
int64[('age', 'i1')]
dt = np.dtype([('age',np.int8)]) a = np.array([(10,),(20,),(30,)], dtype = dt) print(a)
輸出結果爲:
[(10,) (20,) (30,)]
dt = np.dtype([('age',np.int8)]) a = np.array([(10,),(20,),(30,)], dtype = dt) print(a['age'])
輸出結果爲:
[10 20 30]
實例2:定義一個結構化數據類型 student,包含字符串字段 name,整數字段 age,及浮點字段 marks,並將這個 dtype 應用到 ndarray 對象。
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) print(student)
輸出結果:
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
import numpy as npstudent = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) print(a)
輸出結果爲:
[(b'abc', 21, 50.) (b'xyz', 18, 75.)]
字符 | 對應類型 |
---|---|
b | 布爾型 |
i | (有符號) 整型 |
u | 無符號整型 integer |
f | 浮點型 |
c | 複數浮點型 |
m | timedelta(時間間隔) |
M | datetime(日期時間) |
O | (Python) 對象 |
S, a | (byte-)字符串 |
U | Unicode |
V | 原始數據 (void) |
numpy 數據類型轉換須要調用方法 astype(),不能直接修改 dtype。調用 astype 返回數據類型修改後的數據,可是源數據的類型不會變,須要進一步對源數據的賦值操做才能改變。
實例:
da = np.array([1.2,1.1,1.0])# 輸出 da 的數據類型print(da.dtype)# 輸出 float64
# 轉換 da 的數據類型print(da.astype(np.int32))# 輸出 [1 1 1]
# 從新查看數據類型,發現數據類型還未改變print(da.dtype)# 輸出 float64
# 從新進行賦值操做da = da.astype(np.int32)print(da.dtype) # 輸出int32
print(da)# 輸出 [1 1 1]
咱們把形如 z=a+bi(a, b均爲實數)的數稱爲複數,其中 a 稱爲實部,b 稱爲虛部,i 稱爲虛數單位。
當虛部 b=0 時,複數 z 是實數;
當虛部 b!=0 時,複數 z 是虛數;
當虛部 b!=0 ,且實部 a=0 時,複數 z 是純虛數。
實例:
import numpy as np a = np.array([1, 2, 3], dtype = complex) print (a)
輸出:
[1.+0.j 2.+0.j 3.+0.j]
如上輸出結果就是複數形式的數據類型
本章節是對 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