目錄
- NumPy 入門
- 陣列(Ndarray)
- 創建陣列物件
- 陣列的查詢操作
- 提取單獨元素的索引
- 提取子陣列的索引(切片)
- 陣列的修改(部分賦值)操作
- 陣列的屬性
- 陣列的方法
- 陣列相關的 numpy 庫常用函式
- 矩陣(Matrix)
- 創建矩陣物件
- 矩陣的查詢操作
- 矩陣的屬性
- 矩陣的方法
- 矩陣相關的 numpy 庫常用函式
- 矩陣增加操作(比較奇特)
- 矩陣的特殊操作
NumPy 入門
使用 NumPy 庫需先匯入 numpy 模塊,習慣性,我們將匯入后的模塊重新命名為 np,
import numpy as np
下面,我們主要學習 numpy 中的兩種資料結構
陣列(Ndarray)
創建陣列物件
有以下多種常用的創建陣列物件的方法:
- 用 np.array() 函式將 python 串列陣列(list)轉換為 numpy 的陣列物件,
>>> np.array([1,2,3,4])
array([1, 2, 3, 4])
- np.arange() 函式,傳入一到三個引數,arange([start,] stop, [step] ),其中start默認為0,step默認為1,此外,和 list(range()) 生成陣列一樣,np.arange() 生成的陣列不包含 stop,
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3.0)
array([ 0., 1., 2.])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])
- np.ones() 函式和 np.zeros() 函式 生成全1或全0陣列,np.empty() 函式生成空陣列(實際上是未初始化陣列,其內部每個元素是有具體值的),ones/zeros/empty(shape, dtype=None) shape引數要求傳入為整數或只含整數的序列(元組、串列),
>>> np.ones(5)
array([1., 1., 1., 1., 1.])
>>> np.ones((5,), dtype=int)
array([1, 1, 1, 1, 1])
>>> np.zeros((2, 1))
array([[ 0.],
[ 0.]])
>>> s = (2,2)
>>> np.zeros(s)
array([[ 0., 0.],
[ 0., 0.]])
>>> np.empty([2, 2])
array([[ -9.74499359e+001, 6.69583040e-309],
[ 2.13182611e-314, 3.06959433e-309]]) #uninitialized
>>> np.empty([2, 2], dtype=int)
array([[-1073741821, -1067949133],
[ 496041986, 19249760]]) #uninitialized
- np.random.rand() 函式創建0~1亂數陣列,rand(d0, d1, …, dn) 此函式創建多維陣列時,傳入多個引數即可,如果需要更多生成隨機陣列的函式,在 shell 用 print 函式列印 np.random 的__doc__屬性即可了解,例如根據檔案我們知道 np.random.randn() 可以生成正態分布亂數陣列,
>>> np.random.rand(3,2)
array([[ 0.14022471, 0.96360618], #random
[ 0.37601032, 0.25528411], #random
[ 0.49313049, 0.94909878]]) #random
- np.random.linspace() 函式可以將指定的范圍均分為指定長度的陣列,linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0) 將從 start 到 stop 的范圍,均分為 num 個點的陣列,endpoint 默認 True 表示包括 stop 點,retstep 如果設定為 True ,最后回傳的會是一個元組,元組第一個引數是 array 陣列,第二個引數是步長,
>>> np.linspace(2.0, 3.0, num=5)
array([2. , 2.25, 2.5 , 2.75, 3. ])
>>> np.linspace(2.0, 3.0, num=5, endpoint=False)
array([2. , 2.2, 2.4, 2.6, 2.8])
>>> np.linspace(2.0, 3.0, num=5, retstep=True)
(array([2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
陣列的查詢操作
這里我們和 python 串列(List)一樣,分為“索引”和“切片”兩塊介紹,
以二維陣列 array 和三維陣列 array2 為例,我們先創建這個兩個陣列,(后面的內容也需要用到這兩個陣列)
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> array2 = np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],
[[9,10,11,12],[5,6,7,8],[1,2,3,4]]])
提取單獨元素的索引
方法一:和串列一樣的索引方式
>>> array[2]
array([ 9, 10, 11, 12])
>>> array[2][2]
11
方法二:Ndarray 獨有的索引方式,在中括號中,用逗號隔開對不同維數的索引,
>>> array[2,2]
11
>>> array2[0,2]
array([ 9, 10, 11, 12])
提取子陣列的索引(切片)
一維陣列索引: 一維陣列的切片操作和 python 的串列一樣,
>>> a = np.arange(5)
>>> a[:2]
array([0, 1])
多維陣列索引: 用逗號隔開不同維數的切片,其余格式和一維陣列索引一樣,(位于后面的維數如果不需要索引的話可以不寫)
>>> array[1:3,2:4]
array([[ 7, 8],
[11, 12]])
>>> array2[:,1:]
array([[[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[ 5, 6, 7, 8],
[ 1, 2, 3, 4]]])
陣列的修改(部分賦值)操作
我們將陣列的索引、切片寫在等號左側,可對陣列進行部分賦值,
>>> array[0:2,0:2] = [[0,1],[2,3]]
>>> array
array([[ 0, 1, 3, 4],
[ 2, 3, 7, 8],
[ 9, 10, 11, 12]])
>>> array[2][2] = 100
>>> array
array([[ 0, 1, 3, 4],
[ 2, 3, 7, 8],
[ 9, 10, 100, 12]])
陣列的屬性
shape 屬性:陣列的結構(回傳一個整數元組,表示陣列各個維度的長度)
dtype 屬性:陣列元素的資料型別(回傳 numpy.dtype 物件,表示資料型別)
size 屬性:陣列含有元素個數(回傳 int 物件,表述陣列含有資料的個數)
itemsize 屬性:陣列元素資料型別所占位元組數(回傳 int 物件)
ndim 屬性:陣列維度(回傳 int 物件)
>>> for s in ['shape','dtype','size','itemsize','ndim']:
print(s,':\t',str(eval('array.'+s)))
shape : (3, 4)
dtype : int32
size : 12
itemsize : 4
ndim : 2
可能被修飾為屬性的方法:
T 屬性:回傳陣列的轉置
陣列的方法
- reshape() 方法,改變陣列的維數結構并作為回傳值回傳,傳入若干個引數分別表示新的結構每一維的長度,改變前后各維數長度乘積應該一致(元素個數必須相等),最后一個維度長度引數可以傳入 -1 ,
>>> array3 = array.reshape(2,-1)
>>> array3
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
陣列相關的 numpy 庫常用函式
- np.append() 函式,
append(arr, values, axis=None) 在 axis 指定為整數 i 時(范圍為 0 ~ ndim-1 ),傳入至少兩個陣列引數(可以是 ndarray 物件或 list 物件),使陣列的 shape[i] 代表的維度增加若干元素,并將拓寬后的 ndarray 物件作為回傳值回傳,(例如2維陣列,axis=1 時為拓寬列數,axis=0 時為拓寬行數;3維陣列,axis=2 時為拓寬每一塊的列數)
arr 引數為增加前的陣列,values 為需要增加的元素組成的陣列,注意 values 的維度和 arr 應一致,且 shape 屬性除了第 i 元素外其他元素應相等(例如 2維陣列在 axis=1 條件下,列數(ndarray.shape[1])可以不一樣,但其他維數長度必須相等),
注意:np.append() 函式,輸入的兩個陣列引數和回傳值的維度兩兩相等,
axis 為默認值 None 時,arr 和 values 會默認變為一維陣列,此時對傳入陣列的結構無要求,
>>> array3 = np.append(array,[[1],[2],[3]],axis=1)
>>> array4 = np.append([[1,2],[3,4]],[[1],[2]])
>>> array5 = np.append(array2,array2,0)
>>> print(array3,array4,array5,sep='\n————————\n')
[[ 1 2 3 4 1]
[ 5 6 7 8 2]
[ 9 10 11 12 3]]
————————
[1 2 3 4 1 2]
————————
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]]
- np.delete() 函式,
delete(arr, obj, axis=None) 在 axis 指定為整數 i 時(范圍為 0 ~ ndim-1 ),使陣列 arr 的 shape[i] 代表的維度洗掉指定的一些列(行),并將洗掉部分元素后的 ndarray 物件作為回傳值回傳,(例如2維陣列,axis=1 時為洗掉某些列,axis=0 時為洗掉某些行數;3維陣列,axis=2 時為拓寬每一塊的列數)
arr 引數為洗掉前的陣列,obj為需要洗掉的行(列)的序號(范圍為 0 ~ ndim-1 ),可以是整數或整陣列成的序列,
axis 為默認值 None 時,arr 會默認變為一維陣列,
>>> np.delete(array, 1, 0)
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
>>> np.delete(array, np.s_[::2], 1)
array([[ 2, 4],
[ 6, 8],
[10, 12]])
>>> np.delete(array, [1,3,5], None)
array([ 1, 3, 5, 7, 8, 9, 10, 11, 12])
- np.vstack() 縱向堆疊函式 和 np.hstack() 橫向堆疊函式,
傳入一個元組引數(其實可以是串列,但容易和串列型別的陣列搞混),里面包含你需要堆疊的若干個列數(或行數)相等的一維或二維陣列,回傳將其縱向(或橫向)堆疊拼接后的一維或二維的 ndarray 物件,
注意:和 np.append() 函式的區別在于,其傳入、回傳的物件的維度可以不一致,且可以將多個物件(但需要放到一個元組里)進行拼接,
>>> np.append([[1,2]],[[3,4]],0)
array([[1, 2],
[3, 4]])
>>> np.vstack(([1,2],[3,4]))
array([[1, 2],
[3, 4]])
>>> np.hstack(([1,2],[3,4],[5]))
array([1, 2, 3, 4, 5])
矩陣(Matrix)
創建矩陣物件
- np.matrix() 傳入一維或二維陣列或串列,回傳矩陣物件,(結合陣列中的特殊陣列創建方法,則可以創建一些特殊矩陣)
>>> np.mat(np.ones((3,3),int))
matrix([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>>> np.mat([0])
matrix([[0]])
矩陣的查詢操作
和陣列完全一致,
矩陣的屬性
shape 屬性:回傳一個元組,包含矩陣的行數、列數,
size 屬性:回傳一個整數,代表矩陣內元素的個數,
dtype 屬性:回傳 numpy.dtype 物件,代表矩陣內元素的型別,
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> matrix = np.mat(array)
>>> for x in ['shape','size','dtype']:
print(x,':',str(eval('matrix.'+x)))
shape : (3, 4)
size : 12
dtype : int32
可能被修飾為屬性的方法:
T 屬性:回傳矩陣的轉置
矩陣的方法
- tolist() 方法,可以將矩陣變為串列,
>>> matrix.tolist()
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
矩陣相關的 numpy 庫常用函式
- np.delete() 洗掉函式,
和陣列的洗掉操作基本一致,唯一區別是當 axis 為默認值 None 時,矩陣不會變為一維(因為矩陣就是二維的),但行數仍會被壓扁到一行,
# 仍用上面的 matrix 矩陣
>>> np.delete(matrix,1,0)
matrix([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
>>> np.delete(matrix,(1,3,5,7))
matrix([[ 1, 3, 5, 7, 9, 10, 11, 12]])
矩陣增加操作(比較奇特)
- np.c_[此處為若干個陣列或矩陣] 行連接方法 和 np.r_[此處為若干個陣列或矩陣] 列連接方法,(行連接相當于左右拓寬,列連接相當于上下拓寬)
注意:這個不是函式,甚至 _ 后面都不是小括號,而是用中括號,
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> matrix = np.mat(array)
>>> np.c_[matrix,array,[[1],[2],[3]]]
matrix([[ 1, 2, 3, 4, 1, 2, 3, 4, 1],
[ 5, 6, 7, 8, 5, 6, 7, 8, 2],
[ 9, 10, 11, 12, 9, 10, 11, 12, 3]])
矩陣的特殊操作
- 矩陣乘法
方法一:使用 * 乘號可以直接實作矩陣乘法
方法二:對一個矩陣 mat1 使用方法 .dot() 可以使 mat1 右乘一個矩陣,
>>> mat1 = np.mat([1,2,3])
>>> mat1.T * mat1
matrix([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
>>> mat1.dot(mat1.T)
matrix([[14]])
- 矩陣求逆
使用 np.linalg.inv() 函式,傳入一個矩陣,回傳該矩陣的逆矩陣,如果傳入的矩陣為奇異矩陣,則會拋出錯誤,
>>> mat2 = np.mat([[1,2],[3,4]])
>>> np.linalg.inv(mat2)
matrix([[-2. , 1. ],
[ 1.5, -0.5]])
>>> np.linalg.inv([[0,1],[0,0]])
Traceback (most recent call last):
File "<pyshell#95>", line 1, in <module>
np.linalg.inv([[0,1],[0,0]])
File "<__array_function__ internals>", line 6, in inv
File "D:\py\lib\site-packages\numpy\linalg\linalg.py", line 547, in inv
ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
File "D:\py\lib\site-packages\numpy\linalg\linalg.py", line 97, in _raise_linalgerror_singular
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix
- 矩陣求特征值
使用 np.linalg.eig() 函式,傳入一個矩陣,回傳一個元組,元組第一個值為該矩陣的特征值組成的 ndarray 陣列,元組的第二個值為特征值對應的標準化后的特征向量按列組成的矩陣(第一列代表的特征向量對應第一個特征值),
>>> np.linalg.eig([[1,2],[2,1]])
(array([ 3., -1.]), array([[ 0.70710678, -0.70710678],
[ 0.70710678, 0.70710678]]))
'''此處特征值 3 對應的標準化特征向量為 (0.7071,0.7071)'''
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259328.html
標籤:python
