Numpy是利用python来进行数据分析中必须要掌握的基础。是高性能科学计算和数据分析的基础包。利用numpy能对整组数据无需循环就能进行快速的标准数学函数计算,同时能进行线性代数,随机数,以及傅里叶变换等等功能,而对于数据分析来说,比较重要的用途就是数据的清理,过滤,子集构造,转换,排序,描述统计等等。
在使用的时候,对某个API接口记得不是太轻,需要从新度娘,这势必会浪费比较多的时间,因此就有了想总结它的想法,并且随着时间的推移,总结的越来越多,那么就会对numpy的用法越来越熟悉。
使用随机数random模块
随机数初始化的时候,主要有normal正态(高斯)分布、rand均匀分布样本、uniform均匀分布值。
normal正态(高斯)分布
使用np.random.normal函数,函数的参数有loc=0.0, scale=1.0, size=None。
loc为高斯分布的均值,scale为分布的标准差,size为数组的大小。API中的例子为。
mu, sigma = 0, 0.1 # mean and standard deviation
s = np.random.normal(mu, sigma, 1000)
Verify the mean and the variance:
>>> abs(mu - np.mean(s)) < 0.01
True
>>> abs(sigma - np.std(s, ddof=1)) < 0.01
True
数组生成的例子为:
import numpy as np
mu, sigma = 0, 0.1
# 1D
arr = np.random.normal(mu, sigma, size = (3))
print(arr)
#[ 0.06965057 -0.15870178 0.02776434]
# 2D
arr = np.random.normal(mu, sigma, size = (3,2))
print(arr)
# [[-0.14856599 -0.1339647 ]
# [-0.02832001 0.00522524]
# [-0.22456789 -0.09488004]]
rand均匀分布样本
# rand均匀分布
arr = np.random.rand(3)
print(arr)
# [0.50379029 0.9398595 0.77199327]
arr = np.random.rand(3,3)
print(arr)
# [[0.92527252 0.81515781 0.28641155]
# [0.75766423 0.33699374 0.03968092]
# [0.33108546 0.54098272 0.98990623]]
uniform均匀分布值
参数为:uniform(low=0.0, high=1.0, size=None)
# 1D
arr = np.random.uniform(0,5,size=(4))
print(arr)
# [0.43100465 2.21567654 0.3282392 3.81198367]
# 2D
arr = np.random.uniform(0,5,size=(4,4))
print(arr)
# [[3.0967155 1.02823125 1.89036565 2.32619461]
# [2.9605799 3.78598498 0.73145289 3.3206741 ]
# [1.9616998 4.39008304 4.08777598 3.42920063]
# [3.99813399 1.4941342 3.33004881 2.78779658]]
连续/随机整数
连续整数使用arange(start=None, stop=None, step=None, dtype=None)
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])
随机整数使用:np.random.randint(low, high=None, size=None, dtype=’l’)
>>> np.random.randint(2, size=10)
array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])
>>> np.random.randint(1, size=10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> np.random.randint(5, size=(2, 4))
array([[4, 0, 2, 1],
[3, 2, 2, 0]])
协方差矩阵及特征值和特征向量
协方差矩阵通过 np.cov,具体的参数为:
cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,
aweights=None):
默认以行为向量单位,如果将rowvar设置为false,则以列为单位。
arr = np.random.rand(3,3)
print(arr)
# [[0.17750436 0.44068993 0.86621122]
# [0.927718 0.27433882 0.16296677]
# [0.73082541 0.44597569 0.06591675]]
cov_arr = np.cov(arr)
print(cov_arr)
# [[ 0.12077536 -0.12434009 -0.11576978]
# [-0.12434009 0.17069209 0.12282209]
# [-0.11576978 0.12282209 0.11128128]]
计算出来协方差矩阵后,一般接下来是求它的特征值和特征向量,他俩在PCA降维中可以说是一对如影随从的好基友。特征值和特征向量通过np.linalg.eig。
eigVals,eigVects=np.linalg.eig(cov_arr)
print(eigVals)
# [2.74727275e-01 4.78818792e-18 4.54322373e-02]
print(eigVects)
# [[ 0.99203055 -0.10295612 -0.07263208]
# [-0.11423842 -0.49179201 -0.86318607]
# [-0.05315041 -0.86460433 0.49963425]]
矩阵运算
矩阵运算常见的有加、减、乘、对数、e、平方、开平方等操作。
a = np.random.randint(0,4,size=(3))
b = np.random.randint(5,10,size=(3))
# [2 1 0]
print(a)
# [8 6 5]
print(b)
arr_add = a + b
# [10 7 5]
print(arr_add)
arr_diff = a -b
# [-6 -5 -5]
print(arr_diff)
# 这里是矩阵的对应的元素相乘,要保证矩阵的尺寸相同
arr = a*b
# [16 6 0]
print(arr)
arr = np.exp(a)
# [7.3890561 2.71828183 1. ]
print(arr)
arr = np.log(b)
# [2.07944154 1.79175947 1.60943791]
print(arr)
arr = np.square(a)
# [4 1 0]
print(arr)
arr = np.sqrt(b)
# [2.82842712 2.44948974 2.23606798]
print(arr)
sum = np.sum(a)
# 3
print(sum)
meam = np.mean(a)
# 1.0
print(meam)
# 求标准差
arr = np.std(a)
# 1.4142135623730951
print(arr)
矩阵还有一些高级的运算,例如矩阵相乘,转置等。
a = np.random.randint(0,4,size=(3,2))
b = np.random.randint(0,4,size=(2,3))
print(a)
# [[2 0]
# [2 1]
# [0 1]]
print(b)
# [[0 3 1]
# [0 1 0]]
print(a.dot(b))
# [[0 6 2]
# [0 7 2]
# [0 1 0]]
print(a.T)
# [[2 2 0]
# [0 1 1]]
Numpy函数库中还存在另外一种数据类型matrix,在进行矩阵的运算时,它好比就是array的升级版,可以完成例如矩阵求逆,矩阵相乘,转置等操作。
mat_a = np.mat(a)
mat_b = np.mat(b)
# <class 'numpy.matrixlib.defmatrix.matrix'>
print(type(mat_a))
# [[6 3 2]
# [9 6 0]
# [3 2 0]]
print(mat_a * mat_b)
print(mat_a.I)
# [[-3.51716474e-17 3.00000000e-01 1.00000000e-01]
# [ 1.00000000e+00 -3.00000000e-01 -1.00000000e-01]]
print(mat_b.T)
# [[3 3]
# [2 1]
# [0 2]]
矩阵维度转换
矩阵将为1D
通过使用flatten,可以将矩阵的维度按照行或列将为1D。
>>> a = np.array([[1,2], [3,4]])
>>> a.flatten()#默认是按照行进行降维,如果要按照列进行降维,则使用'F'
array([1, 2, 3, 4])
>>> a.flatten('F')
array([1, 3, 2, 4])
维度转换
维度的转换通过reshape,将矩阵从n*m,变为k*l,注意n*m = k*l。
arr = np.random.randint(7,size=(3,4))
a = arr.reshape(2,6)
print(a)
print(arr)
#[[3 1 0 1 3 0]
# [1 3 2 1 3 0]]
#[[3 1 0 1]
# [3 0 1 3]
# [2 1 3 0]]
切片Slice
切片的规则为:[start:end:step],默认的step为1,如果要进行方向切片,则step = -1,如果要反向选取n个元素,则为[-1:-(n+1):-1]。例如:
arr = np.random.randint(1,10,size=(8))
print(arr)
# 反向选取4个元素
print(arr[-1:-5:-1])
#out = [8 7 5 4 2 5 2 4]
# [4 2 5 2]
获取最大值
使用argmax,可以返回矩阵的最大值所在的位置。例如:
>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> np.argmax(a)
5
>>> np.argmax(a, axis=0)
array([1, 1, 1])
>>> np.argmax(a, axis=1)
array([2, 2])
如果想获取最大值,可以直接使用np.max,例如:
>>> a = np.arange(4).reshape((2,2))
>>> a
array([[0, 1],
[2, 3]])
>>> np.amax(a) # Maximum of the flattened array
3
>>> np.amax(a, axis=0) # Maxima along the first axis
array([2, 3])
>>> np.amax(a, axis=1) # Maxima along the second axis
array([1, 3])
排序
如果要对numpy进行升序排列,则用np.sort(array),如果要进行降序排列,则步骤为:
arr = np.random.randint(1,10,size=(8))
print(arr)
#[6 2 9 1 8 8 2 3]
print(arr[-1:-5:-1])
#[3 2 8 8]
arr = np.sort(arr)
print(arr)
#[1 2 2 3 6 8 8 9]
print(arr[-1::-1])
#[9 8 8 6 3 2 2 1]
对矩阵排序也可以使用argsort,它返回的是数组值从小到大的索引值。例如:
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
array([1, 2, 0])
Two-dimensional array:
>>> x = np.array([[0, 3], [2, 2]])
>>> x
array([[0, 3],
[2, 2]])
>>> np.argsort(x, axis=0)
array([[0, 1],
[1, 0]])
>>> np.argsort(x, axis=1)
array([[0, 1],
[0, 1]])
文件存取
numpy的文件读取主要有tofile和fromfile、save()和load()、savetxt()和loadtxt()等.具体就不往上写了,当一次搬运工,详细的使用可以参考:https://blog.csdn.net/voidfaceless/article/details/54619535或
https://blog.csdn.net/kebu12345678/article/details/54837245
这两个博文写的都比较详细.
获取非0
API为nonzero,返回两个数组,分别为非0元素所在的x,y的位置。例如:
>>> x = np.array([[1,0,0], [0,2,0], [1,1,0]])
>>> x
array([[1, 0, 0],
[0, 2, 0],
[1, 1, 0]])
>>> np.nonzero(x)
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))
如果需要将位置组合在一起,则需要使用np.transpose:
>>> np.transpose(np.nonzero(x))
array([[0, 0],
[1, 1],
[2, 0],
[2, 1])
数学运算
向量的夹角,使用arctan2(y, x),其中x作为X轴,要作为Y轴,即(x,y)组成的矩阵与原点(0, 0)的夹角。
>>> x = np.array([-1, +1, +1, -1])
>>> y = np.array([-1, -1, +1, +1])
>>> np.arctan2(y, x) * 180 / np.pi
array([-135., -45., 45., 135.])