数组转置和交换轴
转置
矩阵的行列交换
1. numpy.where (x if condition else y)
result = [(x if c else y) for x, y, c in zip(arr1, arr2, arr3)]
等价于np.where(arr1, arr2, arr3)
arr = np.random.randn(4, 4)#生成一个4行4列的矩阵
np.where(arr > 0, 2, -2)#根据arr>0的Boolean类型,如果为True则arr中对应位置填为2,否则为-2。其中where中的第一个变量为condition(条件)
########################################################################
np.where(arr > 0, 2, arr)
2. 数学计算和统计方法
np.mean(arr) <==> arr.mean()
np.sum(arr) <==> arr.sum()
np.std(arr) <==> arr.std()
#针对每行进行的操作,如求和或者求平均值
arr.mean(axis = 1) <==> np.mean(arr, axis = 1)
#针对每列进行的操作,如求和
arr.sum(axis = 0) <==> np.sum(arr, axis = 0) #
##############################################################################
cumsum 和 cumprod #分别为计算轴向累加和,累积
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr.cumsum(axis = 0) <==>[[0, 1, 2],
[3, 5, 7],
[9, 12, 15]]
arr.cumprod(axis = 1)
############################################################################
min && max 求最大值最小值
argmin && argmax 返回最大值最小值的索引
3. 布尔矩阵的方法
#布尔值分为1(True)和 0(False)
arr = np.random.randn(100)
(arr > 0).sum()#求正数的个数
#any 常用来检测是否有不少于一个的True;all常用来检测是否全为True
bools = np.array([False, False, True, False])
bools.any()#True
bools.all()#False
4. 排序
#sort
arr = np.random.randn(5, 3)
arr.sort(1)#arr每行中的数据进行升序排序 arr会变为排序以后的
5. unique和其他集合操作
#本部分介绍基于集合的一些操作
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names)#输出为['Bob', 'Joe', 'Will'],并做了排序
np.unique等价于sorted(set(names)
##########################################################################
np.in1d(arr1, list)#主要是判断arr1与list中的值得关系
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])#返回array([True, False, False, True, True, False, True])
#########################################################################
intersect1d(x, y)#对x和y中共有的元素进行排序(交集),是集合操作(元素唯一性)
union1d(x, y)#对x和y中所有的元素进行排序(并集),集合操作
setdiff1d(x, y)#求出只存在于x中的元素集合
setxor1d(x, y)#求出分别只存在于x和y中的元素集合
线性代数
np.dot(x, y) <==> x.dot(y)#表示矩阵x与y的乘积
x @ y#表达的意思与上面一致
#########################################################################
from numpy.linalg import inv, qr
X = np.random.randn(5, 5)
mat = X.T.dot(X)
inv(mat)#求矩阵mat的逆
mat.dot(inv(mat))#矩阵乘以它的逆等于单位阵
numpy.linalg
|函数 |说明|
|-|:-:|-:|
diag | 返回矩阵的对角线元素或者创建对角线元素等于特定值的矩阵
dot | 矩阵乘积
trace | 计算矩阵对角线元素之和(即矩阵的迹)
det | 计算矩阵的行列式,求矩阵的值
eig | 计算矩阵(方阵)的特征值和特征向量返回的第一个参数是特征值,第二个参数为特征向量
inv | 计算矩阵(方阵)的逆
pinv | 计算矩阵(方阵)的Moore-Penrose伪逆
qr | 计算矩阵的QR分解
svd | 计算奇异值分解svd
solve | 解线性方程组Ax = b, 其中A为方阵
lstsq | 计算Ax = b的最小二乘解
随机数生成
numpy.random
|函数名|描述|
|-|:-:|-:|
|seed|随机数种子|
|permutation|随机打乱数组,可支持array_like,int,返回打乱后得array|
|shuffle|随机打乱数组,只能是array_like,默认返回空值|
rand|返回指定数组形状的0-1范围的随机浮点数
randint(low, high, size)|产生指定范围[low, high)的随机数,size是元组表示产生的形状size = (2, 4)为2*4的矩阵
randn|产生标准正太分布随机数
binomial|产生二项分布随机数binomial(n, p, size),n试验次数、概率、轮数
normal|正态(高斯)分布,normal([local, scale, seize])
uniform|均匀分布,uniform([low, high, size])
随机游走
#生成1000个随机数
import numpy as np
import matplotlib.pyplot as plt
nsteps = 1000
draws = np.random.randint(0, 2, size = nsteps)
steps = np.where(draws > 0, 1, -1)#draws > 0 ,利用了矩阵的广播特性,判断出True or False,True为1,False为-1
walk = steps.cumsum()#累和
walk.min()#矩阵的操作求得最小值,max为最大值
#假如我们想要知道随机游走第一次达到离源点的距离达到一个Value,可以采用
(np.abs(walk) >= Value).argmax()
#一次性生成多个随机游走模型
nwalks = 5000 #5000个随机模型
nsteps = 1000 #随机走1000步
draws = np.random.randint(0, 2, size = (nwalks, nsteps))
steps = np.where(draws > 0, 1, -1)
walks = steps.cumsum(1)#得出5000个随机游走模型的1000步对应的值
hits30 = (np.abs(walks) >= 30).any(1)#得出有绝对值大于30的行,返回[False,....,False, True, ..., False]
hits30.sum()#统计有大于的随机模型的个数
crossing_times = (np.abs(walks[hits30]) >= 30).argmax(1)#其中walks[hits30]返回有绝对值大于30的处理后矩阵,np.abs(walks[hits30])>=30返回大于30为True,小于30为False的bool类型矩阵,最后返回第一次满足大于30的索引
crossing_times.mean()#返回第一次满足大于30的需要的平均步数
######出来上述的0,1分布来生成随机数外,也可以采用其他的,如正态分布
steps = np.random.normal(loc = 0, scale = 0.25, size = (nwalks, nsteps))