This article first appeared in ai-exception
matplotlib.plot
plt.scatter()
功能
绘制点图
源码
def scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None,
vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None,
hold=None, data=None, **kwargs)
主要参数解释:
s表示点点的大小,c就是color,marker就是点点的形状哦o,x,*><^,都可以
alpha表示点点的亮度,label是标签(图例)
用法
def testScatter():
c1=[1,2,3]
c2=[1,2,3]
plt.scatter(c1,c2,s=30,c='red',marker='o',alpha=0.5,label='C1')
plt.show()
结果:
plt.contourf()
功能
绘制等高线
用法
contourf有三个主要参数:
- x:x数据
- y:y数据
- z:z数据,实际上z的数值决定了对应(x,y)点的颜色
此外,还可以设置将等高线分为几个部分。
# 定义等高线高度函数
def f(x, y):
return x-y
def testContourf():
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 生成网格数据
X, Y = np.meshgrid(x, y)
# 填充等高线的颜色,4是将区域分为几个部分
plt.contourf(X, Y, f(X, Y), 4,alpha=0.75, cmap=plt.cm.Spectral)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 4, colors='black', linewidth=0.5)
# 绘制等高线数据
plt.clabel(C, inline=True, fontsize=10)
# 去除坐标轴
plt.xticks(())
plt.yticks(())
plt.show()
结果:
numpy
np.squeeze()
功能
从数组的形状中删除单维条目,即把shape中为1的维度去掉
源码
def squeeze(a, axis=None):
a时待处理的数组/矩阵,axis是待删除的维度,默认为所有维度为1的维度,注意如果要手动指定axis,则必须要求设定的axis对应的维度必须为1,否则会报错。
用法
a=np.random.randn(1,3,1)
b=np.squeeze(a)
print(a.shape)
print(b.shape)
输出:
可以看到当数组中含有维度1时squeeze会删除维度为1的维度。
np.power()
功能
计算元素的n次方
源码
def power(x1, x2, *args, **kwargs):
x1是被次方对象,x2时指数,可以是数字也可以是数组,但是要保证x1和x2的列数相同。
使用
a = np.array([1,2,3])
print(a)
c=np.array([1,2,3])
b=np.power(a,c)
print(b)
输出:
np.meshgrid()
功能
用两个坐标轴上的点在平面上画网格
源码
# Based on scitools meshgrid
def meshgrid(*xi, **kwargs)
使用
- [X,Y]=meshgrid(x,y)
- [X,Y]=meshgrid(x)与[X,Y]=meshgrid(x,x)是等同的
- [X,Y,Z]=meshgrid(x,y,z)生成三维数组,可用来计算三变量的函数和绘制三维立体图
以[X,Y]=meshgrid(x,y)为例,其意义是将向量x和y定义的区域转换成矩阵X和Y,其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制,假设x是长度为m的向量,y是长度为n的向量,则最终生成的矩阵X和Y的维度都是 (n,m) (注意不是(m,n))。
def testMeshgrid():
a = [1, 2, 3]
b = [4, 5, 6]
print(a)
print(b)
[x, y] = np.meshgrid(a, b)
print(x)
print(y)
plt.figure()
plt.scatter(x,y)
plt.show()
np.c_&np.r_
- np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()。
- np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
使用
def testNumpy_r_c():
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[7,8,9],[10,11,12]])
c=np.r_[a,b]
d=np.c_[a,b]
print(a)
print(b)
print(c)
print(d)
输出:
注意
np.r_[a,b] 而不是np.r_(a,b)
np.c_[a,b] 而不是np.c_(a,b)
np.flatten()&np.ravel()
功能
两者所要实现的功能是一致的(将多维数组降位一维),两者的区别在于返回拷贝(copy)还是返回视图(view):
- numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩阵,对原来数组做的操作也不会影响拷贝的数组。
- numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),会影响(reflects)原始矩阵。
使用
def test_ravel_flatten():
x = np.array([[1, 2], [3, 4]])
print(x)
print()
a=x.flatten()
print(x)
print(a)
x[0][0] = 10
x[0][1] = 20
print(a)
a[0]=-1
print(x)
print()
b=x.ravel()
print(x)
print(b)
x[0][0] = 30
x[0][1] = 40
print(b)
b[0]=-1
print(x)
输出:
注意看对a和b与x之间的互相影响关系。
numpy除法运算
保留小数部分的除法
- np.divide(x,n)
- np.true_divide(x,n)
- x/n
向下取整的除法
- np.floor_divide(x,n)
- x//n
使用
x = np.array([[1, 3], [5, 7]])
print(x)
d_x=np.divide(x,2)
print(d_x)
d_x2=x/2
print(d_x2)
d_x3=np.true_divide(x,2)
print(d_x3)
d_x4=np.floor_divide(x,2)
print(d_x4)
d_x5=x//2
print(d_x5)
运行结果:
np.square()
功能
计算矩阵中每个元素的平方
使用
def testSquare():
x = np.arange(5, 10)
print(x)
y=np.square(x)
print(y)
输出:
randn&rand
功能
- numpy.random.randn(d0, d1, …, dn)*是从标准正态分布中返回一个或多个样本值。*
- numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中。
使用
import numpy as np
arr1 = np.random.randn(1,10)
print("np.random.randn结果如下:")
print(arr1)
print('******************************************************************')
print("np.random.rand结果如下:")
arr2 = np.random.rand(1,10)
print(arr2)
输出:
np.linalg.norm()
功能
linalg=linear(线性)+algebra(代数),norm则表示范数,所以就是求矩阵的范数,范数一般是对一批数据求的,比如[x1,x2,x3]具体参数如下:
x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
-
x:表示矩阵,可以是一维的
-
ord表示范数的类型,具体类型如下:
ord=1:列和的最大值
ord=2(默认):|λE-ATA|=0,求特征值,然后求最大特征值的算术平方根
ord=∞:行和的最大值
-
axis:处理类型
axis=1:表示按行向量处理,求多个行向量的范数
axis=0:表示按列向量处理,求多个列向量的范数
axis=None(默认):表示矩阵范数。
-
keepdims:是否保持矩阵的二维特性
True表示保持矩阵的二维特性,False相反
np.copy()
功能
copy()用来拷贝矩阵,这个拷贝属于复制即deep copy,而直接的‘=’是numpycopy,效果来说就是通过copy拷贝的目标矩阵和原矩阵没关系,而‘=’拷贝的目标矩阵会和原矩阵有关联,修改‘=’拷贝后的值会和原来的矩阵互相有影响。
使用
def testCopy():
print('')
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
b=np.copy(a)
c=a
print(b)
print(a)
b[0][0]=100
print(a)
c[0][0]=101
print(a)
a[0][0]=200
print(b)
print(c)
运行结果:
np.pad()
功能
用于对指定数组进行padding填充
源码
pad(array, pad_width, mode, **kwargs)
返回值:数组
参数解释:
array——表示需要填充的数组;
pad_width——表示每个轴(axis)边缘需要填充的数值数目。
pad_width参数输入方式为:((before_1, after_1), … (before_N, after_N)),其中(before_1, after_1)表示第1轴两边缘分别填充before_1个和after_1个数值。取值为:{sequence, array_like, int}
mode——表示填充的方式(取值:str字符串或用户提供的函数),总共有11种填充模式;
‘constant’——表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0
‘edge’——表示用边缘值填充
‘linear_ramp’——表示用边缘递减的方式填充
‘maximum’——表示最大值填充
‘mean’——表示均值填充
‘median’——表示中位数填充
‘minimum’——表示最小值填充
‘reflect’——表示对称填充
‘symmetric’——表示对称填充
‘wrap’——表示用原数组后面的值填充前面,前面的值填充后面
使用
def testNpPad():
print('')
a = np.random.randn(3, 2)
#第0轴(行)的左边填1个1,第0轴的右边填2个2
b = np.pad(a, ((1, 2), (2, 1)), 'constant', constant_values=((1, 2),(3,4)))
print(a)
print(b)
output:
np.mean和np.average的区别
区别
np.mean直接计算平均数
def mean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
np.average计算加权平均数(如果有权重weight的话)
def average(a, axis=None, weights=None, returned=False):
使用
def testMeanAverage():
print('')
a = [1,2,3]
c=np.mean(a)
d=np.average(a,weights=[0.1,0.2,0.7])
print(a)
print(c)
print(d)
output:
参考
1:https://blog.csdn.net/lanchunhui/article/details/50354978
2:https://www.cnblogs.com/xieshengsen/p/6822772.html
3:https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/2-8-np-copy/