1. 程式人生 > >01 NumPy 理解與ndarray建立多維陣列的常用方法與具體例項

01 NumPy 理解與ndarray建立多維陣列的常用方法與具體例項

NumPy get started

  1. 匯入numpy庫
 import numpy as np
  1. 檢視版本
np.__version__
  1. numpy核心其實就是一個 ndarray 多維陣列(演示 ndarray 輸出效果 以及 和 list 的區別)
# 引數 起始值 結束值 陣列大小 起始值能取到 結束值取不到 左閉右開區間 [start,end)
ndarr1 = np.random.randint(1,5,3)
ndarr1
print(ndarr1) # 注意 打印出來的這個東西雖然看上去很像列表 但是ndarry和列表list完全是兩碼事
結果為:[2 1 3]
list1 = [1,2,3]
print(list1)
結果為:[1, 2, 3]
print(type(list1),type(ndarr1)) # 型別是不一樣的  只不過ndarray重寫了__str__() 所以打印出來的內容看上去像列表
結果為:<class 'list'> <class 'numpy.ndarray'>

一、建立ndarray

1. 使用np.array()建立多維陣列

引數為列表: np.array([1,2,3])

注意:

  • numpy預設ndarray的所有元素的型別是相同的
  • 如果傳進來的列表中包含不同的型別,則統一為同一型別,優先順序:str>float>int
ndarr1 = np.array([1,2,3]) # 傳入列表 就可以創建出一個 多維陣列
ndarr1
結果為:array([1, 2, 3])
ndarr1 = np.array([1,2,3.5])# 傳入列表  浮點數 也可以創建出一個 多維陣列
ndarr1
結果為:array([1. , 2. , 3.5])
ndarr1 = np.array([1,2,"3"])
ndarr1
結果為:array(['1', '2', '3'], dtype='<U11')

2. 使用np的常用函式(routines)建立

包含以下常見建立方法:

1) np.ones(shape, dtype=None, order=‘C’)

功能:按照指定形狀建立多維陣列,並用1填充

引數:

shape 用於指定建立的多維陣列的形狀 可以傳入2 或者 (2,3)

dtype 資料的型別 np.int8 np.float64

返回值:返滬建立好的多維陣列陣列

ndarr = np.ones(shape=3)   
結果為:array([1., 1., 1.])
ndarr = np.ones(shape=3,dtype=np.int8) # dtype 可以指定資料的型別
結果為:array([1, 1, 1], dtype=int8)
ndarr = np.ones(shape=(2,3),dtype=np.int8) #通過ones建立的陣列 裡面填充的內容都是1
結果為:array([[1, 1, 1],
       [1, 1, 1]], dtype=int8)

多維陣列

1 數字 [1] 陣列 [1,2,3] 陣列

[ [1,2,3] [7,8,9] ] 數組裡面裝陣列就是多維陣列 數組裡 套著 陣列 兩層陣列就是 二維陣列

[ [ [1,2,3], [1,2,3], ], [ [1,2,3], [1,2,3], ], ] 數組裡套了陣列 裡面又套了陣列 裡面雙套了一個數組 三維陣列

2) np.zeros(shape, dtype=float, order=‘C’)

功能類似np.zeros只不過不是用1填充 而是用0填充

np.zeros(shape=5,dtype=np.int8)
np.zeros(shape=(5,5),dtype=np.int8) # 5x5矩陣
np.zeros(shape=(2,3,4),dtype=np.int8) # 建立了一個三維陣列 數組裡面有兩個陣列 這兩個數組裡分別有三個陣列 這三個數組裡有4個元素
結果為:array([[[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]],

       [[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]]], dtype=int8)

3) np.full(shape, fill_value, dtype=None, order=‘C’)

shape指定形狀 一般可以是 2 或者 (2,3) 之類的

fill_value指定填充的值

np.full(shape=(2,3),fill_value=5)
結果為:
array([[5, 5, 5],
       [5, 5, 5]])

4) np.eye(N, M=None, k=0, dtype=float)

功能:建立一個方陣(行和列的數量相等)

N 指定矩陣中有多少行和列

對角線為1其他的位置為0(單位矩陣)

ndarr = np.eye(5,8,dtype=np.int8) # eye建立的就是一個方陣 從左上角到右下角的對角線上都是1 其他位置都是0 這種矩陣叫做單位矩陣
結果為:array([[1, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0]], dtype=int8)

5.1) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

功能:把start到stop的這個範圍的數,等分成num份兒,填入陣列

np.linspace(1,5,3) # 引數 起始值 結束值 把從開始到結束的這個區間分成多少份 
結果為:array([1., 3., 5.])

5.2) np.logspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

功能:把start到stop的這個範圍的數,等分成num份兒,獲得的值作為10的指數,求出來的值,填入陣列

np.logspace(1,5,3) # 1-3 分成3份兒 1 2 3  引數: 起始值 結束值  把開始值到結束值分成幾份 取出來這些值作為10的指數 然後求出來一系列的值 放到多維陣列中
結果為:array([1.e+01, 1.e+03, 1.e+05])

6) np.arange([start, ]stop, [step, ]dtype=None)

從start,到end,每隔step去一個值,放入一個數組

np.arange(start=1,stop=10,step=2) # 引數 開始值 結束值 步長值 
np.arange(1,5,1) # 注意 起始值能取到 結束值取不到
結果為:array([1, 2, 3, 4])

7) np.random.randint(low, high=None, size=None, dtype=‘l’)

從low到high的範圍隨機取整數,填充多維陣列 size用於指定陣列的形狀 如 2 (2,3)

np.random.randint(1,10,size = (2,3)) # 產生一個多維陣列 陣列中的元素 用隨機數來填充
# 引數 1.隨機數的上界  2.隨機數的下界 3.陣列的形狀 
結果為:array([[1, 2, 9],
       [1, 5, 5]])

8) np.random.randn(d0, d1, …, dn)

傳入幾個引數,就建立幾維陣列

產生以0為中心 方差為1 的 標準正太分佈 的隨機數 填充陣列

如 np.random.randn(2,3,3) 產生一個三維陣列 陣列中有兩個陣列 兩個陣列中分別有三個陣列 三個陣列中每個都有三個元素

np.random.randn(5,5) # 傳入幾個引數就建立一個幾維陣列 裡面的內容是以0為中心按照正態分佈去取的一系列隨機值
結果為:
array([[-0.68088861, -1.20301784,  0.47973059,  1.63136009, -1.60700524],
       [ 0.66516772,  0.53055343,  1.07870966, -0.15624372,  0.13364254],
       [ 0.75700615,  0.07725757, -0.61090081,  0.78132797, -1.5065676 ],
       [-0.2074603 , -0.22326078, -1.40836134,  1.95350144, -1.50458383],
       [-0.56365772, -0.39849581, -1.27015926,  0.83656014, -1.88792472]])

9) np.random.normal(loc=0.0, scale=1.0, size=None)

np.random.randn是標準正態分佈(以0為中心,方差是1) normal可以指定中心和方差

loc 正態分別的中心

scale 正態分佈的變化範圍

size 陣列的形狀 如 2 (2,3)

# randn 固定了分佈的中心就是0 方差是1
# normal 可以自己設定分佈的中心和方差
np.random.normal(loc=10,scale=5,size=(2,3))
結果為:array([[ 6.29446434, 17.05680548,  7.78128077],
       [ 4.4118268 ,  6.36365627,  4.19318215]])

10) np.random.random(size=None)

size指定三維陣列的形狀 如 2 (2,3)

函式隨機生成0到1的隨機數(左閉右開)填充陣列

np.random.random(size=(2,3))
結果為:
array([[0.83305889, 0.33539422, 0.07315796],
       [0.22738693, 0.14877283, 0.86321635]])

練習:使用隨機數成成一張圖片

1.引入matplotlib.pyplot

import matplotlib.pyplot as plt #matplotlib mat matrix 矩陣 plot 繪圖 lib library 庫 矩陣繪相簿

2.讀取圖片 pyplot.imread(要讀取的檔案路的徑字)

jin = plt.imread("./jin.png")

3.檢視引入的圖片的屬性(其實圖片就是一個三維陣列)

jin # 其實圖片就是一個三維陣列 
jin.ndim # ndarray的ndim屬性可以檢視當前多維陣列的維度
jin.shape #一個多維陣列 裡面有273個數組 這273個數組裡面分別有411個數組 411個數組中有三個元素 這個三個元素分別對應 r g b 的值
jin.size #多維陣列的總長度
jin.dtype #裡面元素的資料型別
jin.shape

4. 隨機產生一個數據結構類似的圖片

ndarr9 = np.random.random((273,411,3))

5.根據傳入的資料去繪製圖片 pyplot.imshow(傳入多維陣列資料)

# plt.imshow(jin) # imshow()函式 
plt.imshow(ndarr9)
結果為:<matplotlib.image.AxesImage at 0x22b48f21710>

在這裡插入圖片描述