2、Numpy Ndarray 對象

1、番外說明

大家好,我是小P,本系列是本人對Python模塊Numpy的一些學習記錄,總結於此一方面方便其它初學者學習,另一方面害怕自己遺忘,希望大家喜歡。此外,對“目標檢測/模型壓縮/語義分割”感興趣的小夥伴,歡迎加入QQ羣 813221712 討論交流,進羣請看羣公告!(可以點擊如下連接直接加入!)
點擊鏈接加入羣聊【Object Detection】:https://jq.qq.com/?_wv=1027&k=5kXCXF8

2、正題

參考鏈接:

http://www.runoob.com/numpy/numpy-ndarray-object.html
https://cloud.tencent.com/developer/article/1106669

2.1 ndarray介紹

NumPy 最重要的一個特點是其 N 維數組對象 ndarray,它是一系列同類型數據的集合,以 0 下標爲開始進行集合中元素的索引。ndarray 對象是用於存放同類型元素的多維數組。ndarray 中的每個元素在內存中都有相同存儲大小的區域。

NumPy的ndarray提供了一種將同質數據塊(可以是連續或跨越)解釋爲多維數組對象的方式。正如你之前所看到的那樣,數據類型(dtype)決定了數據的解釋方式,比如浮點數、整數、布爾值等。

ndarray如此強大的部分原因是所有數組對象都是數據塊的一個跨度視圖(strided view)。你可能想知道數組視圖arr[::2,::-1]不復制任何數據的原因是什麼。簡單地說,ndarray不只是一塊內存和一個dtype,它還有跨度信息,這使得數組能以各種步幅(step size)在內存中移動。

ndarray 內部由以下內容組成:

● 一個指向數據(內存或內存映射文件中的一塊數據)的指針,這個指針能夠找到存儲的數組值。

● 數據類型或 dtype,描述在數組中的固定大小值的格子。numpy有一套自己的類型,如np.int8、np.float32

● 一個表示數組形狀(shape)的元組,表示各維度大小的元組。如(3,2)表示3行2列的數組

● 一個跨度元組(stride),其中的整數指的是爲了前進到當前維度下一個元素需要"跨過"的字節數。跨度可以是負數,這樣會使數組在內存中後向移動,切片中 obj[::-1] 或 obj[:,::-1] 就是如此。

ndarray 的內部結構:
在這裏插入圖片描述
一個典型的(C順序,稍後將詳細講解)3×4×5的float64(8個字節)數組,其跨度爲(160,40,8),這兒跨度的計算根據數據的存儲計算,數據三個維度,一共三個跨度。第一個跨度爲4×5×8大小,跨一個二維矩陣平面,第二個跨度爲5×8,跨一個矩陣的一行,第三個跨度爲1×8,跨矩陣的一個元素

知道跨度是非常有用的,通常,跨度在一個軸上越大,沿這個軸進行計算的開銷就越大。雖然NumPy用戶很少會對數組的跨度信息感興趣,但它們卻是構建非複製式數組視圖的重要因素。

可以通過如下代碼獲取數組的跨度,由此可見知道跨度的意義:

A=np.ones((3,4,5),dtype=np.float64)

A.shape
Out[13]: (3, 4, 5)

A
Out[14]: 
array([[[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]],

       [[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]],

       [[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]]])

A.strides
Out[15]: (160, 40, 8)

由上述可知,由第一維跨度160除以第二維跨度,可以知道矩陣的行數,同理,第二維除以第三維跨度可以知道矩陣的列數,這對於C語言中數據按行存儲是非常關鍵的信息。

NumPy數據類型體系

你可能偶爾需要檢查數組中所包含的是否是整數、浮點數、字符串或Python對象。因爲浮點數的種類很多(從float16到float128),判斷dtype是否屬於某個大類的工作非常繁瑣。幸運的是,dtype都有一個超類(比如np.integer和np.floating),它們可以跟np.issubdtype函數結合使用:

In [12]: ints = np.ones(10, dtype=np.uint16)

In [13]: floats = np.ones(10, dtype=np.float32)

In [14]: np.issubdtype(ints.dtype, np.integer)
Out[14]: True

In [15]: np.issubdtype(floats.dtype, np.floating)
Out[15]: True

其中,issubdtype函數用來判斷某類是否是另一個類的子類

調用dtype的mro方法即可查看其所有的父類:

In [16]: np.float64.mro()
Out[16]:
[numpy.float64,
 numpy.floating,
 numpy.inexact,
 numpy.number,
 numpy.generic,
 float,
 object]

然後得到:

In [17]: np.issubdtype(ints.dtype, np.number)
Out[17]: True

其中,mro()用於獲取某個類型的繼承鏈,詳細查詢參考:https://study.163.com/course/courseLearn.htm?courseId=1005985001#/learn/video?lessonId=1053350157&courseId=1005985001

大部分NumPy用戶完全不需要了解這些知識,但是這些知識偶爾還是能派上用場的。下圖說明了dtype體系以及父子類關係。
在這裏插入圖片描述

2.2 ndarray創建數組

創建一個 ndarray 只需調用 NumPy 的 array 函數即可:

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

參數說明:
在這裏插入圖片描述
實例
接下來可以通過以下實例幫助我們更好的理解。

實例 1
生成一個一維的數組

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

輸出結果如下:

array( [1, 2, 3])

實例 2
生成一個二維數組

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

輸出結果如下:

array([[1, 2],
       [3, 4]])

實例 3
通過ndmin參數指定生成數組的最小維度

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

輸出如下:

array([[1, 2, 3, 4, 5]])

注意,當指定ndmin=2時,則表示生成的數組維度爲2,即a的維度爲(1,5),默認前向擴展一維
實例 4
使用dtype 參數更改數據類型

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

輸出結果如下:

array([1.+0.j, 2.+0.j, 3.+0.j])

這兒的數據類型爲複數類型

ndarray 對象由計算機內存的連續一維部分組成,並結合索引模式,將每個元素映射到內存塊中的一個位置。內存塊以行順序(C樣式)或列順序(FORTRAN或MatLab風格,即前述的F樣式)來保存元素。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章