數據分析(1)--numpy和list的用法對比

numpy在深度學習或者數據分析中都是很常用的一個工具庫,今天我結合自己的工作內容以及學習到的一個API的用法,來說下numpy的用法

數組(ndarray)與列表(List)

數組與列表類似,是具有相同類型的多個元素構成的整體。
侷限:

  • 數組元素要求是相同類型,而列表的元素可以是不同類型。

優勢:

  • 數組可以與標量進行運算,數組之間也可以進行矢量化運算。【對應位置的元素進行運算,無需進行循環操作。這樣就可以充分利用現代處理器SIMD Single Instruction,Multiple Data的方式進行並行計算】。
  • 數組在運算時,具有廣播能力。【可根據需要進行元素的擴展,完成運算。】
  • 數組底層使用C程序編寫,運算速度快。
  • 數組底層使用C中數組的存儲方式(緊湊存儲),節省內存空間。

應用對比

  • 將兩個等長的列表(數組)分別進行數學運算(例如,+, -等)。
  • 將一個列表(數組)中的所有元素進行相同的改變。
  • 對步驟2進行計時,衡量時間消耗。(練習)
  • 創建相同大小的列表(數組),衡量內存消耗。(練習)

Numpy

NumPy(Numerical Python的簡稱),是科學計算基礎的一個庫,提供了大量關於科學計算的相關功能,例如,線性變換,數據統計,隨機數生成等。其提供的最核心的類型爲多維數組類型(ndarray)。

使用方式

可以使用如下的方式來安裝numpy庫:
pip install numpy
根據慣例,使用numpy庫的導入方式爲:
import numpy as np
在導入之後,我們可以通過:
np.__version__
來查看Numpyu庫的版本信息。

導入numpy

import numpy as np

數組的創建

Numpy提供了很多方式(函數)來創建數組對象,常用的方式如下:

  • array 聲明一個基本的數組 如:x = np.array([1,2]),y = np.array([[2,4],[4,5]])
  • arange 指定start ,end,step
   import numpy as np
   c = np.arange(3,89,0.1)
  • ones / ones_like 按照參數形狀初始化numpy 初始化全爲1
  • zeros / zeros_like 初始化全爲0
  • empty / empty_like 指定大小的空矩陣
# 創建全爲1的數組。
x = np.ones((5, 3))
# 創建與參數指定數組形狀一致的數組,數組的值全爲1。
y = np.ones_like(x)

# 創建全爲0的數組。
x = np.zeros((2, 3))
# 創建與參數形狀完全相同的數組,數組的值都爲0。
y = np.zeros_like(x)
# print(y)

# 返回指定的形狀的數組,數組的值是尚未初始化的值。(值多少是不確定的。)
x = np.empty((3, 8))
# 創建與參數形狀完全相同的數組,數組的值是尚未初始化的值。
x = np.empty_like(x)
  • full / full_like 這個函數用於數據填充,格式是args0 ,內容是args1如
x = np.full((2, 3), 100)
# np.ones((2, 3))
# 創建與參數形狀完全相同的數組,數組的值使用第二個參數進行填充。
y = np.full_like(x, 200)
y
  • eye / identity 對角單位方陣,對角線爲1
  • linspace 等差數組
  • logspace 等比數組
    np.linspace(1, 10, endpoint=False)
    創建等比數列。(指數或對數上是一個等差數列,真實值就是一個等比數列。)
    前兩個參數表示指數,base表示底數(默認是10)。endpoint表示是否包含終止點(默認包含)。
    np.logspace(1, 10, 10, base=2)
    array([   2.,    4.,    8.,   16.,   32.,   64.,  128.,  256.,  512.,1024.])
    

數組和numpy的速度對比,那個更快?

這個是毫無疑問的一般對於多維數組和矩陣來說矩陣操作更快一些,numpy提供的是矢量操作,多個值可以同時完成同一件事,而數據一般完成這種手段需要手動完成多個線程編寫,或者單線程遍歷,相對慢一些

相關屬性與操作

數組對象具有如下常用屬性:

  • ndim
  • shape
  • dtype
  • size
  • itemsize

數據類型

  • 在創建數組時,也可以使用dtype來顯式指定數組中元素的類型(通過numpy提供的類型進行指定)。
  • 如果沒有指定,則會根據元素類型進行推斷。
  • 如果元素的類型不同,則會選擇一種兼容的類型。

類型轉換

我們可以通過數組對象的astype函數來進行類型轉換。

是否可以直接修改dtype屬性進行類型轉換?

改變形狀

我們可以通過數組對象的reshape方法(或者np的reshape函數)來改變數組的形狀。

說明:

  • 改變數組形狀時,如果維度不小於2,可以將某一個維度設置爲-1。
  • numpy中存在很多方法,既可以使用np來訪問,也可以通過數組對象來訪問。

索引與切片

在Python中,序列類型支持索引與切片操作,在numpy庫中,ndarray數組也支持類似的操作。不過,二者之間既有相同點,也有不同點。

相似點

數組對象也支持索引與切片操作,語法與Python中序列類型的索引與切片相似。
當數組是多維數組時,可以使用array[高維, 低維]的方式按維度進行索引或切片。

不同點

數組的切片返回的是原數組數據的視圖(回憶:Python中呢?)。如果需要複製底層的數組元素,可以使用數組對象的copy方法。
注意:視圖是共享底層的數組元素,但視圖並不是賦值。

思考:通過切片,我們可以選取多個元素,但是,如果我們要選取的低維數組(或元素)是不連續的,該怎樣做?

通過整數數組進行索引

當要選取的元素不連續時,可以提供一個索引數組來選擇(或修改)對應索引位置的元素。

說明:

  • 通過整數數組索引,返回的是原數組的拷貝,而不是視圖。
  • 可以提供多個一維數組索引,此時會將每個數組的對應位置元素作爲索引,返回對應的元素。

通過布爾數組進行索引

我們可以提供一個布爾類型的數組(A),然後通過該數組(A)來對另外一個數組(B)進行索引(元素選取)。索引的原則爲:如果爲True,則選取對應位置的元素,否則不選取。

通過布爾類型的數組進行索引是常見且實用的操作,我們通常用來進行元素選擇(或過濾)操作。例如:

  • 選擇一個公司中所有年齡大於15的年齡。
  • 選擇兩個數組中對應位置相同的元素。
  • 將所有大於100的值設置爲100。

說明:

  • 用於索引的布爾數組通常通過現有數組計算得出。
  • 可以通過~對條件進行取反操作(不能使用not)。
  • 當存在多個條件時,可以使用&,|符號(不能使用and與or),同時,每個條件需要使用()進行括起。

篇幅問題,下一篇會繼續分享常見函數的用法!

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