首頁 >後端開發 >Python教學 >深入理解NumPy簡明教程---陣列1

深入理解NumPy簡明教程---陣列1

高洛峰
高洛峰原創
2017-02-23 16:50:572012瀏覽

這篇文章主要介紹了深入理解NumPy簡明教程(二、數組1),NumPy數組是一個多維數組對象,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

目前我的工作是將NumPy引入Pyston(一款Dropbox實作的Python編譯器/解譯器)。在工作過程中,我深入接觸了NumPy原始碼,了解其實作並提交了PR修復NumPy的bug。在與NumPy原始碼以及NumPy開發者打交道的過程中,我發現當今中文NumPy教程大部分都是翻譯或參考英文文檔,因此導致了許多疏漏。例如NumPy數組中的broadcast功能,幾乎所有中文文件都翻譯為「廣播」。而NumPy的開發者之一,回覆到「broadcast is a compound -- native English speakers can see that it's " broad" + "cast" = "cast (scatter, distribute) broadly, I guess "cast (scatter, distribute) broadly" probably is closer to the meaning(NumPy中的含義)"。有鑑於此,我打算啟動一個項目,以我對NumPy使用以及源碼層面的了解編寫一個系列的教程。 #NumPy數組


NumPy數組是一個多維數組對象,稱為ndarray。

#描述這些資料的元資料

  • 大部分運算只針對於元數據,而不改變底層實際的資料。 #關於NumPy數組有幾點必需了解的:

  • NumPy數組的下標從0開始。元素的型別必須是相同的。

    在詳細介紹NumPy陣列之前。類推。每個元素又是一個一維數組。 ,就是數組的維數。 (即陣列軸的個數),等於秩。維度上大小的整數元組。

##ndarray.size:陣列元素的總個數,等於shape屬性中元組元素的乘積。

    ndarray.dtype:表示陣列中元素類型的對象,可使用標準的Python類型建立或指定dtype。另外也可使用前一篇文章中介紹的NumPy提供的資料類型。
  • ndarray.itemsize:陣列中每個元素的位元組大小。例如,一個元素類型為float64的陣列itemsiz屬性值為8(float64佔用64個bits,每個位元組長度為8,所以64/8,佔用8個位元組),又如,一個元素類型為complex32的數組item屬性為4(32/8)。
  • ndarray.data:包含實際陣列元素的緩衝區,由於一般透過陣列的索引取得元素,所以通常不需要使用這個屬性。

  • 建立陣列

先來介紹建立陣列。創建數組的方法有很多。如可以使用array函數從常規的Python列表和元組創造數組。所建立的數組類型由原始序列中的元素類型推導出來。    

>>> from numpy import *     
>>> a = array( [2,3,4] )    
>>> a 
  array([2, 3, 4]) 
>>> a.dtype 
  dtype('int32') 
>>> b = array([1.2, 3.5, 5.1])    
>>> b.dtype 
  dtype('float64')

使用array函數建立時,參數必須是由方括號括起來的列表,而不能使用多個數值作為參數呼叫array。   

  • >>> a = array(1,2,3,4)  # 错误 
    >>> a = array([1,2,3,4]) # 正确

  • 可使用雙重序列來表示二維的數組,三重序列表示三維數組,以此類推。
  • >>> b = array( [ (1.5,2,3), (4,5,6) ] )   
    >>> b 
      array([[ 1.5, 2. , 3. ], 
          [ 4. , 5. , 6. ]])
  • 可以在建立時明確指定數組中元素的類型

  • >>> c = array( [ [1,2], [3,4] ], dtype=complex) 
    >>> c 
      array([[ 1.+0.j, 2.+0.j], 
         [ 3.+0.j, 4.+0.j]])

  • 通常,剛開始時數組的元素未知,而數組的大小已知。因此,NumPy提供了一些使用佔位符建立數組的函數。這些函數有助於滿足除了數組擴展的需要,同時降低了高昂的運算開銷。
  • 用函數zeros可建立一個全是0的數組,用函數ones可建立一個全為1的數組,函數empty創建一個內容隨機並且依賴與記憶體狀態的數組。預設創建的數組類型(dtype)都是float64。
  • 可以喲娜特d.dtype.itemsize來查看陣列中元素所佔用的位元組數目。

  • >>> d = zeros((3,4)) 
    >>> d.dtype 
    dtype('float64') 
    >>> d 
    array([[ 0., 0., 0., 0.], 
        [ 0., 0., 0., 0.], 
        [ 0., 0., 0., 0.]]) 
    >>> d.dtype.itemsize 
    8

也可以自己制定陣列中元素的型別

>>> ones( (2,3,4), dtype=int16 ) #手动指定数组中元素类型 
   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]]], dtype=int16) 
>>> empty((2,3)) 
   array([[ 2.65565858e-316,  0.00000000e+000,  0.00000000e+000], 
       [ 0.00000000e+000,  0.00000000e+000,  0.00000000e+000]])

NumPy提供一个类似arange的函数返回一个数列形式的数组:

>>> arange(10, 30, 5) 
  array([10, 15, 20, 25])

以10开始,差值为5的等差数列。该函数不仅接受整数,还接受浮点参数: 

>>> arange(0,2,0.5) 
  array([ 0. , 0.5, 1. , 1.5])

当arange使用浮点数参数时,由于浮点数精度有限,通常无法预测获得的元素个数。因此,最好使用函数linspace去接收我们想要的元素个数来代替用range来指定步长。linespace用法如下,将在通用函数一节中详细介绍。

>>> numpy.linspace(-1, 0, 5) 
    array([-1. , -0.75, -0.5 , -0.25, 0. ])

数组中的元素是通过下标来访问的,可以通过方括号括起一个下标来访问数组中单一一个元素,也可以以切片的形式访问数组中多个元素。关于切片访问,将在切片一节介绍。

知识点:NumPy中的数据类型

对于科学计算来说,Python中自带的整型、浮点型和复数类型远远不够,因此NumPy中添加了许多数据类型。如下:

NumPy中的基本数据类型


NumPy中的基本数据类型
名称 描述
bool 用一个字节存储的布尔类型(True或False)
inti 由所在平台决定其大小的整数(一般为int32或int64)
int8 一个字节大小,-128 至 127
int16 整数,-32768 至 32767
int32 整数,-2 ** 31 至 2 ** 32 -1
int64 整数,-2 ** 63 至 2 ** 63 - 1
uint8 无符号整数,0 至 255
uint16 无符号整数,0 至 65535
uint32 无符号整数,0 至 2 ** 32 - 1
uint64 无符号整数,0 至 2 ** 64 - 1
float16 半精度浮点数:16位,正负号1位,指数5位,精度10位
float32 单精度浮点数:32位,正负号1位,指数8位,精度23位
float64或float 双精度浮点数:64位,正负号1位,指数11位,精度52位
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128或complex 复数,分别用两个64位浮点数表示实部和虚部

NumPy类型转换方式如下:

>>> float64(42) 
  42.0 
>>> int8(42.0) 
  42 
>>> bool(42) 
  True 
>>> bool(42.0) 
  True 
>>> float(True) 
  1.0

许多函数的参数中可以指定参数的类型,当然,这个类型参数是可选的。如下:

>>> arange(7, dtype=uint16) 
  array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)

输出数组

当输出一个数组时,NumPy以特定的布局用类似嵌套列表的形式显示:

  • 第一行从左到右输出

  • 每行依次自上而下输出

  • 每个切片通过一个空行与下一个隔开

  • 一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。 

>>> a = arange(6)             # 1d array 
>>> print a 
  [0 1 2 3 4 5] 
    
>>> b = arange(12).reshape(4,3)      # 2d array 
>>> print b 
  [[ 0 1 2] 
  [ 3 4 5] 
  [ 6 7 8] 
  [ 9 10 11]]    
>>> c = arange(24).reshape(2,3,4)     # 3d array 
>>> print c 
  [[[ 0 1 2 3] 
  [ 4 5 6 7] 
  [ 8 9 10 11]] 
    
  [[12 13 14 15] 
  [16 17 18 19] 
  [20 21 22 23]]]

 reshape将在下一篇文章中介绍 

如果一个数组太长,则NumPy自动省略中间部分而只打印两端的数据:   

>>> print arange(10000) 
   [  0  1  2 ..., 9997 9998 9999] 
    
>>> print arange(10000).reshape(100,100) 
   [[  0  1  2 ...,  97  98  99] 
    [ 100 101 102 ..., 197 198 199] 
    [ 200 201 202 ..., 297 298 299] 
    ..., 
    [9700 9701 9702 ..., 9797 9798 9799] 
    [9800 9801 9802 ..., 9897 9898 9899] 
    [9900 9901 9902 ..., 9997 9998 9999]]

可通过设置printoptions参数来禁用NumPy的这种行为并强制打印整个数组。

set_printoptions(threshold='nan')

这样,输出时数组的所有元素都会显示出来。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多深入理解NumPy简明教程---数组1相关文章请关注PHP中文网!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn