Numpy庫入門

數據的維度

維度:一組數據的組織形式python

一維數據程序員

  一維數據由對等關係的有序或無序數據構成,採用線性方式組織算法

列表和數組:一組數據的有序結構數組

列表:數據類型能夠不一樣

  3.1413, 'pi', 3.1404, [3.1401, 3.1349], '3.1376'

數組:數據類型相同

  3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376

二維數據app

  二維數據由多個一維數據構成,是一維數據的組合形式函數

  表格是典型的二維數據其中,表頭是二維數據的一部分工具

多維數據性能

  多維數據由一維或二維數據在新維度上擴展造成優化

高維數據spa

  高維數據僅利用最基本的二元關係展現數據間的複雜結構

{
            "firstName":"Tian",
            "lastName" :"Song",
            "adress"   :{
                        "streetAddr":"中關村南大街5號",
                        "city"      :"北京市",
                        "zipcode"   :"100081"
                        },
            "prof"     :["Computer System", "Security"]
}

數據維度的Python表示

一維數據:列表和集合類型

[3.1398, 3.1349, 3.1376] 有序
{3.1398, 3.1349, 3.1376} 無序

二維數據:列表類型

[ [3.1398, 3.1349, 3.1376],
[3.1413, 3.1404, 3.1401] ]

多維數據:列表類型

高維數據:字典類型 或數據表示格式

dict = {
                "firstName":"Tian",
                 "lastName" :"Song",
       } 

Numpy是什麼

  NumPy(Numerical Python的縮寫)是一個開源的Python科學計算庫。使用NumPy,就能夠很天然地使用數組和矩陣。NumPy包含不少實用的數學函數,涵蓋線性代數運算、傅里葉變換和隨機數生成等功能。若是你的系統中已經裝有LAPACK,NumPy的線性代數模塊會調用它,不然NumPy將使用本身實現的庫函數。LAPACK是一個著名的數值計算庫,最初是用ortran寫成的,Matlab一樣也須要調用它。從某種意義上講,NumPy能夠取代Matlab和Mathematica的部分功能,而且容許用戶進行快速的交互式原型設計。

  NumPy是一個開源的Python科學計算基礎庫,包含:

  • 一個強大的N維數組對象 ndarray
  • 廣播功能函數
  • 整合C/C++/Fortran代碼的工具
  • 線性代數、傅里葉變換、隨機數生成等功能

  NumPy是SciPy、Pandas等數據處理或科學計算庫的基礎

爲何使用Numpy

  對於一樣的數值計算任務,使用NumPy要比直接編寫Python代碼便捷得多。這是由於NumPy可以直接對數組和矩陣進行操做,能夠省略不少循環語句,其衆多的數學函數也會讓編寫代碼的工做輕鬆許多。NumPy的底層算法在設計時就有着優異的性能,而且經受住了時間的考驗。NumPy是開源的,這意味着使用NumPy能夠享受到開源帶來的全部益處。價格低到了極限——免費。雖然NumPy自己不能用來繪圖,可是Matplotlib和NumPy二者完美地結合在一塊兒,其繪圖能力可與Matlab相媲美。

Numpy的數組對象:ndarry

  爲了更好的進行科學計算,須要理解numpy的構成原理以及其中最關鍵的對象ndarry。

N維數組對象:ndarray

Python已有列表類型,爲何須要一個數組對象(類型)?

經過一個實例進行上述問題的分析:

例:計算A^2+B^3

在python中計算

# calculae A^2+B^3

def pySum():
            a = [0, 1, 2, 3, 4]
            b = [9, 8, 7, 6, 5]
            c = []

            for i in range(len(a)):
                        c.append(a[i]**2 + b[i]**3)

            return c
print(pySum())

# 輸出結果
[729, 513, 347, 225, 141]

在引入numpy以後計算

# calculae A^2+B^3 numpy
import numpy as np
# AB屬於同一維度時,能夠直接運算,不然會報錯
def npSum():
            a = np.array([0, 1, 2, 3, 4])
            b = np.array([9, 8, 7, 6, 5])

            c = a**2 + b**3

            return c
print(npSum())

# 輸出結果
[729 513 347 225 141]

經過上述兩種運算方式的比較,能夠得出所提問題的解:

  • 數組對象能夠去掉元素間運算所需的循環,使一維向量更像單個數據
  • 設置專門的數組對象,通過優化,能夠提高這類應用的運算速度
  • 科學計算中,一個維度全部數據的類型每每相同
  • 數組對象採用相同的數據類型,有助於節省運算和存儲空間

ndarray是一個多維數組對象,由兩部分構成:

  • 實際的數據
  • 描述這些數據的元數據(數據維度、數據類型等)

  ndarray數組通常要求全部元素類型相同(同質),數組下標從0開始

ndarray實例

  ndarry中兩個重要的概念:軸(axis): 保存數據的維度;秩(rank):軸的數量

# ndarray

import numpy as np
# ndarray在程序中的別名是 array
# np.array()生成一個ndarray數組
a = np.array([[1, 2, 3],[4, 5, 6]])
b = np.array([7, 8, 9])
# np.array()輸出成[]形式,元素由空格分割
print(a)
# 輸出結果
[[1 2 3]
 [4 5 6]]
print(b)
# 輸出結果
[7 8 9]

ndarray對象的屬性

屬性 說明
.ndim 秩,即軸的數量或維度的數量
.shape ndarray對象的尺度,對於矩陣,n行m列
.size ndarray對象元素的個數,至關於.shape中n*m的值                
.dtype ndarray對象的元素類型
.itemsize             ndarray對象中每一個元素的大小,以字節爲單位

元素屬性實例

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

print(a.ndim)      # 2
print(a.shape)     # (2,3)
print(a.size)      # 6
print(a.dtype)     # int32
print(a.itemsize)  # 4

ndarry數組的元素類型

ndarray的元素類型(1) (表格在Word210%顯示下截圖)

ndarray的元素類型(2) 

ndarray的元素類型(3) 

ndarray爲何要支持這麼多種元素類型?

  • 對比:Python語法僅支持整數、浮點數和複數3種類型
  • 科學計算涉及數據較多,對存儲和性能都有較高要求
  • 對元素類型精細定義,有助於NumPy合理使用存儲空間並優化性能
  • 對元素類型精細定義,有助於程序員對程序規模有合理評估

非同質ndarray對象沒法有效發揮NumPy優點,儘可能避免使用,實例以下

# ndarray非同質對象
import numpy as np

x = np.array([[0,1],[2,3,4]])
print(x.shape)    # (2,)
print(x.dtype)    # object
print(x.size)     # 2
print(x.ndim)     # 1
print(x.itemsize) # 8

y = np.array([[0,1],[2,3]])
print(y.shape)    # (2,2)
print(y.dtype)    # int32
print(y.size)     # 4
print(y.ndim)     # 2
print(y.itemsize) # 4

ndarry數組的變換ndarry數組的建立 

  • 從Python中的列表、元組等類型建立ndarray數組
  • 使用NumPy中函數建立ndarray數組,如:arange, ones, zeros等

 具體用法以下

# 建立numpy數組
import numpy as np

x = np.arange(10)
print(x)
# 輸出結果
[0 1 2 3 4 5 6 7 8 9]

x = np.ones((3,6))
print(x)
# 輸出結果
[[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]

x = np.zeros((3,6))
print(x)
# 輸出結果
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]

x = np.ones((2,3,4))
print(x)
# 輸出結果
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

x = np.eye(5)
print(x)
# 輸出結果
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

 具體用法以下

# 建立numpy數組

import numpy as np

x = np.eye(5)
print(x)
# 輸出結果
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

y = np.ones_like(x)
print(y)
# 輸出結果
[[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.]]

y = np.zeros_like(x)
print(y)
# 輸出結果
[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

y = np.full_like(x,5)
print(y)
# 輸出結果
[[5. 5. 5. 5. 5.]
 [5. 5. 5. 5. 5.]
 [5. 5. 5. 5. 5.]
 [5. 5. 5. 5. 5.]
 [5. 5. 5. 5. 5.]]

 具體用法以下

import numpy as np
a = np.linspace(1, 10, 4)
print(a)
# 輸出結果
[ 1.  4.  7. 10.]

b = np.linspace(1, 10, 4, endpoint=False) # 不包含最後一個元素10,分紅5份
print(b)
# 輸出結果
[1.   3.25 5.5  7.75]

c = np.concatenate((a, b))
print(c)
# 輸出結果
[ 1.    4.    7.   10.    1.    3.25  5.5   7.75]
  • 從字節流(raw bytes)中建立ndarray數組
  • 從文件中讀取特定格式,建立ndarray數組

ndarray數組的變換

  對於建立後的ndarray數組,能夠對其進行維度變換和元素類型變換

ndarray數組的維度變換

方法

說明

.reshape(shape)

不改變數組元素,返回一個shape形狀的數組,原數組不變

.resize(shape)

與.reshape()功能一致,但修改原數組

.swapaxes(ax1,ax2)

將數組n個維度中兩個維度進行調換

.flatten()

對數組進行降維,返回摺疊後的一維數組,原數組不變

實例以下

# numpy數組變化

import numpy as np

a = np.ones((2,3,4))
print(a)
# 輸出結果
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

b = a.reshape((3,8))
print(b)
# 輸出結果
[[1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1.]]

ndarray數組的類型變換

# numpy數組元素類型變化

import numpy as np

a = np.ones((2,3), dtype=np.int)
print(a)
# 輸出結果
[[1 1 1]
 [1 1 1]]

b = a.astype(np.float)
print(b)
# 輸出結果
[[1. 1. 1.]
 [1. 1. 1.]]

ndarry數組的操做

# numpy數組的操做

import numpy as np
a = np.arange(24).reshape(2,3,4)
print(a)
# 輸出結果
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

print(a[1,2,3])    # 23
print(a[0,1,2])    # 6
print(a[-1,-2,-3]) # 17

數組的切片

print(a[:,1,-3])   # [ 5 17]

print(a[:,1:3,:])  # 1:3 左閉右開,包含1,不包含3
# 輸出結果
[[[ 4  5  6  7]
  [ 8  9 10 11]]

 [[16 17 18 19]
  [20 21 22 23]]]
      
print(a[:,:,::2])
# 輸出結果
[[[ 0  2]
  [ 4  6]
  [ 8 10]]

 [[12 14]
  [16 18]
  [20 22]]]

ndarry數組的運算

數組與標量之間的運算

# numpy數組的運算

import numpy as np
a = np.arange(24).reshape(2,3,4)

print(a.mean())    # 11.5
a = a/a.mean()
print(a)
# 輸出結果
[[[0.         0.08695652 0.17391304 0.26086957]
  [0.34782609 0.43478261 0.52173913 0.60869565]
  [0.69565217 0.7826087  0.86956522 0.95652174]]

 [[1.04347826 1.13043478 1.2173913  1.30434783]
  [1.39130435 1.47826087 1.56521739 1.65217391]
  [1.73913043 1.82608696 1.91304348 2.        ]]]

Numpy的運算函數

NumPy一元函數

 

 NumPy二元函數

相關文章
相關標籤/搜索