py numpy
numpy 辨异(三)—— hstack/column_stack,linalg.eig/linalg.eigh - Zhang's Wikipedia - CSDN博客
1.3 NumPy:创建和操作数值数据
numpy 根据位置 修改指定的数据
output_img[np.where(mask0==0)] = 0
Generate 数据生成函数
1. linspace(start,stop,num,endpoint,retstep) "一段线给个起点和终点截成几段"
start : 序列的起始点.
stop : 序列的结束点
num : 生成的样本数,默认是50。必须是非负。
endpoint : 如果True,'stop'是最后一个样本。否则,它不包括在内。默认为True。
retstep : 如果True,返回 (samples
, step
)
dtype :
import numpy as np
# endpoint=True时,输出包含了“stop”这个样本点;endpoint=False时,输出不包括“stop”这个样本点;
# 默认情况endpoint=True。
print(np.linspace(2.0, 3.0, num=5)) # [ 2. 2.25 2.5 2.75 3. ]
print(np.linspace(2.0, 3.0, num=5, endpoint=True)) # [ 2. 2.25 2.5 2.75 3. ]
print(np.linspace(2.0, 3.0, num=5, endpoint=False)) # [ 2. 2.2 2.4 2.6 2.8]
# retstep的使用: retstep=True时输出了步长(step),此时步长为0.25
a = np.linspace(2.0, 3.0, num=5, retstep=True)
# (array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
print(a[0]) # [ 2. 2.25 2.5 2.75 3. ]
print(a[1]) # 0.25
Linear Algebra Cheat Sheet for Machine Learning
速查表共分为 7 部分:
数组
向量
矩阵
矩阵类型
矩阵运算
矩阵分解
统计
数组
有很多种方法创建 Numpy 数组。
数组
from numpy import array
A = array([[1,2,3],[1,2,3],[1,2,3]])
Empty函数
from numpy import empty
A = empty([3,3])
Zeros函数
from numpy import zeros
A = zeros([3,5])
Ones函数
from numpy import ones
A = ones([5, 5])
向量
向量就是一列标量。
向量加法
c = a + b
向量减法
c = a - b
向量乘法
c = a * b
向量除法
c = a / b
向量点积
c = a.dot(b)
向量-标量乘法
c = a * 2.2
向量范数
from numpy.linalg import norm
l2 = norm(v)
矩阵
矩阵就是由标量组成的二维数组。
矩阵加法
C = A + B
矩阵减法
C = A - B
矩阵乘法(Hadamard积)
C = A * B
矩阵除法
C = A / B
矩阵-矩阵乘法(点积)
C = A.dot(B)
矩阵-向量乘法(点积)
C = A.dot(b)
矩阵-标量乘法
C = A.dot(2.2)
矩阵类型
在更广泛的计算中,常将不同类型的矩阵用作元素。
三角矩阵
lower
from numpy import tril
lower = tril(M)
upper
from numpy import triu
upper = triu(M)
对角矩阵
from numpy import diag
d = diag(M)
单位矩阵
from numpy import identity
I = identity(3)
矩阵运算
在更广泛的计算中,矩阵运算常会被用作元素。
矩阵转置
B = A.T
矩阵求逆
from numpy.linalg import inv
B = inv(A)
矩阵的迹
from numpy import trace
B = trace(A)
矩阵行列式
from numpy.linalg import det
B = det(A)
矩阵秩
from numpy.linalg import matrix_rank
r = matrix_rank(A)
矩阵分解
矩阵分解就是将其拆解为几个部分,让其它运算更简单、在数值上更稳定。
LU分解
from scipy.linalg import lu
P, L, U = lu(A)
QR分解
from numpy.linalg import qr
Q, R = qr(A, 'complete')
特征分解
from numpy.linalg import eig
values, vectors = eig(A)
奇异值分解
from scipy.linalg import svd
U, s, V = svd(A)
统计
统计部分总结了向量和矩阵的知识,常被用于组成更广泛的计算。
均值
from numpy import mean
result = mean(v)
方差
from numpy import var
result = var(v, ddof=1)
标准偏差
from numpy import std
result = std(v, ddof=1)
协方差矩阵
from numpy import cov
sigma = cov(v1, v2)
线性最小二乘
from numpy.linalg import lstsq
b = lstsq(X, y)
np.hstack np.column_stack
>>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([1, 2, 3, 4, 5, 6]) >>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 4], [2, 5], [3, 6]])
当然对等地,也存在,np.vstack, np.row_stack
>>> np.vstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 2, 3], [4, 5, 6]]) >>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 2, 3], [4, 5, 6]]) # 两者近乎等效
2. np.linalg.eig() np.linalg.eigh()
首先一点,不管二者处理的是不是对称阵,两者处理的首先是方阵(square array)。
两者均用于矩阵特征分解,np.linalg.eigh() 适用于对称矩阵,可见矩阵分析中针对对称矩阵的特征值分解有一套特殊的不同于一般矩阵的理论。def main(): X = np.random.randn(3, 3) X = X.triu() X += (X.T-np.diag(X.diagonal())) # 构造对称矩阵 X Lambda1, Q1 = np.linalg.eig(X) Lambda2, Q2 = np.linalg.eigh(X) print(Lambda1) # [ 1.53176315 -0.35907022 -1.8924684 ] # 排序不太严格 print(Lambda2) # [-1.8924684 -0.35907022 1.53176315] # 严格的升序 if __name__ == '__main__': main()
3. array.T vs array.transpose()
形式上 array.T 自然比 array.transpose() 这样一个函数调用形式稍显简洁。
>>> x = np.ones((3, 4)) >>> x.T array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> x.transpose() array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
事实上,
x.T == x.transpose(range(x.ndim)[::-1])
>>> x.transpose(range(x.ndim)[::-1]) array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
4. np.triu np.tril
np.triu:upper triangle of an array
np.tril:lower triangle of an array>>> x = np.array([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]) >>> x array([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]) >>> np.triu(x) array([[1, 2, 3], [0, 4, 5], [0, 0, 7], [0, 0, 0]]) >>> np.tril(x) array([[1, 0, 0], [3, 4, 0], [5, 6, 7], [7, 8, 9]])
5 concatenate 与 hstack/vstack
注意,要进行拼接的数组都是以 tuple_like
((a, b))
的形式传递给这三个函数的,np.concatenate((a, b), axis=0) == np.vstack((a, b)) # 也对应于默认的情况,np.concatenate((a, b)) np.concatenate((a, b), axis=1) == np.hstack((a, b))