第81天:NumPy Ndarray_Object&NumPy_Data_Type


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 Ndarray 對象

NumPy 最重要的一個特點是其 N 維數組對象 ndarray,Ndarray 從名字組成上看是 Nd-array,顧名思義就是 N 維數組的意思,它是一系列多維且同類型數據的集合,以 下標為 0 開始進行集合中元素的索引。ndarray 是內存存儲,換言之 ndarray 對象由計算機內存的連續一部分組成,並結合索引模式,將每個元素映射到內存塊中的一個位置,它比列表存儲節省空間

  • ndarray 對象是用於存放同類型元素的多維數組。
  • ndarray 中的每個元素在內存中都有相同存儲大小的區域。

1、ndarray 內部內容組成

  • 一個指向數據(內存或內存映射文件中的一塊數據)的指針。
  • 數據類型或 dtype,描述在數組中的固定大小值的格子。
  • 一個表示數組形狀(shape)的元組,表示各維度大小的元組。
  • 一個跨度元組(stride),其中的整數指的是為了前進到當前維度下一個元素需要"跨過"的字節數。

2、ndarray 的內部結構

ndarray 內部結構

3、創建 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 函數即可,如下:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

3.1 參數說明

名稱 描述
object 數組或嵌套的數列
dtype 數組元素的數據類型,可選
copy 對象是否需要復制,可選
order 創建數組的樣式,C為行方向,F為列方向,A為任意方向(默認)
subok 默認返回一個與基類類型一致的數組
ndmin 指定生成數組的最小維度

值得注意的是:ndmin 默認為數值為 0

3.2 運用實例

創建一個簡單的 ndarray 對象,單維數組

import numpy as np 
a = np.array([1,2,3])  
print (a)

輸出結果如下:

[1 2 3]

創建一個大於 1 維的數組

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 數據類型

NumPy 支持的數據類型比 Python 內置的類型要更多,基本上可以和 C 語言的數據類型對應上,其中部分類型對應為 Python 內置的類型。

1、NumPy 常用數據類型

下表列舉了 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,等等。

2、數據類型對象-dtype

數據類型對象是用來描述與數組對應的內存區域如何使用,這依賴如下幾個方面:

  • 數據的類型(整數,浮點數或者 Python 對象)
  • 數據的大小(例如, 整數使用多少個字節存儲)
  • 數據的字節順序(小端法或大端法)
  • 在結構化類型的情況下,字段的名稱、每個字段的數據類型和每個字段所取的內存塊的部分
  • 如果數據類型是子數組,它的形狀和數據類型

字節順序是通過對數據類型預先設定"<"或">"來決定的。"<"意味着小端法(最小值存儲在最小的地址,即低位組放在最前面)。">"意味着大端法(最重要的字節存儲在最小的地址,即高位組放在最前面)。

dtype 對象是使用以下語法構造的:

numpy.dtype(object, align, copy)
  • object - 要轉換為的數據類型對象
  • align - 如果為 true,填充字段使其類似 C 的結構體。
  • copy - 復制 dtype 對象 ,如果為 false,則是對內置數據類型對象的引用

實例操作:

實例 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

3、結構化數據類型的運用

結構化數據類型的使用,類型字段和對應的實際類型將被創建

實例1:創建年齡數組並且應用於 ndarray 對象

1)創建一個結構化數據類型
da = np.dtype(np.int64)
print(da)

# 創建
dt = np.dtype([('age',np.int8)])
print(dt)

輸出結果為:

int64
[('age', 'i1')]
2)將結構化數據類型應用於ndarray 對象
dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt) 
print(a)

輸出結果為:

[(10,) (20,) (30,)]
3) 類型字段名可以用於存取實際的 age 列
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 對象。

1) 創建數組
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
print(student)

輸出結果:

[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
2) 將數組應用與 ndarray 對象
import numpy as np
student = 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.)]

3.1 內建類型的字符代碼如下:

字符 對應類型
b 布爾型
i (有符號) 整型
u 無符號整型 integer
f 浮點型
c 復數浮點型
m timedelta(時間間隔)
M datetime(日期時間)
O (Python) 對象
S, a (byte-)字符串
U Unicode
V 原始數據 (void)

3.2 NumPy 數據類型轉換

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]

4、復數

我們把形如 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

關注公眾號:python技術,回復"python"一起學習交流


免責聲明!

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



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