一、numpy库简介
Python标准库中提供了一个array类型,用于保存数组类型的数据,然而这个类型不支持多维数据,不适合数值运算。作为Python的第三方库numpy便有了用武之地。
numpy库处理的最基础数据类型是用同种元素构成的多维数组(ndarray),简称数组。数组中所有元素的类型必须相同,数组中元素可以用整数索引,序号从0开始。ndarray类型的维度叫作轴(axes),轴的个数叫做秩(rank)。
二、库函数基本使用
1. 创建数组的函数 (ndarray类型)
函数 |
说明 |
np.array([ x, y, z], dtype = int) |
从列表或数组中创建数组 |
np.arange(x, y, i) |
创建一个由x到y,以i为步长的数组 |
np.linspace(x, y, n) |
创建一个由x到y,等分成n个元素的数组 |
创建一个m行n列的矩阵(3维数组) |
|
np.random.rand(m, n) |
创建一个m行n列的随机数组 |
np.ones((m,n), dtype) |
创建一个m行n列的全1数组,dtype为数据类型 |
np.zeros((m,n), dtype) |
创建一个m行n列的全0数组,dtype为数据类型 |
创建一个m行n列的空数组,dtype为数据类型 |
2. ndarray类型的常用属性
属性 |
说明 |
ndarray.ndim |
返回数组轴的个数,即数组的秩 |
ndarray.shape |
返回数组在每个维度上大小的整数元组 |
ndarray.size |
返回数组元素的总个数 |
ndarray.dtype |
返回数组元素的数据类型 |
ndarray.itemsize |
返回数组元素的字节大小 |
ndarray.data |
返回数组元素的缓存区地址 |
ndarray.flat |
数组元素的迭代器 |
3. ndarray类型的形态操作方法
操作方法 |
说明 |
ndarray.reshape(n, m) |
返回一个维度为(n, m)的数组副本 |
ndarray.resize(new_shape) |
修改数组的维度大小 |
ndarray.swapaxes(ax1, ax2) |
调换数组ax1维度与ax2维度,返回调换后的数组 |
ndarray.flatten() |
对数组进行降维,返回一维数组 |
ndarray.ravel() |
对数组进行降维,返回数组的一个视图 |
4. ndarray类型的索引与切片方法
方法 |
说明 |
x [i] |
索引数组x的第i个元素 |
x [-i] |
从后往前索引数组x的第i个元素 |
x [n : m] |
从前往后索引数组x,不包含第m个元素 |
x [-m : -n] |
从后往前索引数组x,结束位置为n |
x [n : m: i] |
以i为步长索引数组x |
5. ndarray类型的算术运算函数
函数 |
说明 |
np.add(x1, x2 [,y]) |
y = x1 + x2 |
np.subtract(x1, x2 [,y]) |
y = x1 - x2 |
np.multiply(x1, x2 [,y]) |
y = x1 * x2 |
np.divide(x1, x2 [,y]) |
y = x1 / x2 |
np.floor_divide(x1, x2 [,y]) |
y = x1 // x2 |
np.negative(x [,y]) |
y = -x |
np.power(x1, x2 [,y]) |
y = x1 ** x2 |
np.remainder(x1, x2 [,y]) |
y = x1 % x2 |
6. ndarray类型的比较运算函数
函数 |
说明 |
np.equal(x1, x2 [,y]) |
y = x1 == x2 |
np.not_equal(x1, x2 [,y]) |
y = x1 != x2 |
np.less(x1, x2 [,y]) |
y = x1 < x2 |
np.less_equal(x1, x2 [,y]) |
y = x1 <= x2 |
np.greater(x1, x2 [,y]) |
y = x1 > x2 |
np.greater_equal(x1, x2 [,y]) |
y = x1 >= x2 |
根据条件判断输出x或y |
7. ndarray类型的其他运算函数
函数 |
说明 |
np.abs(x) |
返回数组x每个元素的绝对值 |
np.sqrt(x) |
返回数组x每个元素的平方根 |
np.square(x) |
返回数组x每个元素的平方 |
np.sign(x) |
返回数组x每个元素的符号:1(+)、0、-1(-) |
np.ceil(x) |
返回大于或等于数组x每个元素的最小值 |
np.floor(x) |
返回小于或等于数组x每个元素的最大值 |
np.rint(x [,out]) |
返回数组x每个元素最接近的整数 |
np.exp(x [,out]) |
返回数组x每个元素的指数值 |
np.log(x) / np.log2(x) / np.log10(x) |
返回数组x每个元素相应的对数(e、2、10) |
三、matplotlib库
简介
- matplotlib 是提供数据绘图功能的第三方库,其pyplot 子库主要用于实现各种数据展示图形的绘制。
- matplotlib.pyplot 是matplotlib 的子库,引用方式如下: >>>import matplotlib.pyplot as plt
- 上述语句与import matplotlib.pyplot 一致,as 保留字与import 一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在后续程序中,plt 将代替matplotlib.pyplot。
- matplotlib 库由一系列有组织有隶属关系的对象构成,这对于基础绘图操作来说显得过于复杂。因此,matplotlib 提供了一套快捷命令式的绘图接口函数,即pyplot 子模块。pyplot 将绘图所需要的对象构建过程封装在函数中,对用户提供了更加友好的接口。pyplot 模块提供一批预定义的绘图函数,大多数函数可以从函数名辨别它的功能。
四、1)plt 库的绘图区域函数
- 使用figure()函数创建一个全局绘图区域,并且使它成为当前的绘图对象,figsize参数可以指定绘图区域的宽度和高度,单位为英寸。鉴于figure()函数参数较多,这里采用指定参数名称的方式输入参数。 >>> plt.figure(figsize=(8,4))
- subplot()都用于在全局绘图区域内创建子绘图区域,其参数表示将全局绘图区域分成nrows 行和ncols 列,并根据先行后列的计数方式在plot_number 位置生成一个坐标系,实例代码如下,三个参数关系如图10.3 所示。其中,全局绘图区域被风割成3x2 的网格,其中,在第4 个位置绘制了一个坐标系。
- axes()默认创建一个subplot(111)坐标系,参数rec = [left,bottom,width,height]中四个变量的范围都为[0,1],表示坐标系与全局绘图区域的关系;axisbg 指背景色,默认为white。
2)plt 库的读取和显示函数
3)plt 库的基础图表函数
4)plt 库的基础图表函数
五、使用numpy、matplotlib模块绘制成绩雷达图
import numpy as np
import matplotlib.pyplot as plt
#标签
labels = np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])
#数据个数
dataLenth = 6
#数据
data = np.array([80,100,90,100,110,90])
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
data = np.concatenate((data, [data[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)# polar参数!!
ax.plot(angles, data, 'bo-', linewidth=2)# 画线
ax.fill(angles, data, facecolor='r', alpha=0.55)# 填充
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
ax.set_title("李诗然(学号:2019310143022)成绩雷达图", va='bottom', fontproperties="SimHei")
ax.set_rlim(0,110)
ax.grid(True)
plt.show()
六、使用PIL、numpy模块绘制自定义手绘风
from PIL import Image
import numpy as np
a = np.asarray(Image.open("C:\pic.1.jpg").convert('L')).astype('float')
depth = 10. #(0-100)
grad = np.gradient(a) #取图像灰度的梯度值
grad_x, grad_y = grad #分别取横纵图像的梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响
dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响
dz = np.sin(vec_el) #光源对z 轴的影响
b = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
b = b.clip(0,255)
im = Image.fromarray(b.astype('uint8')) #重构图像
im.save('pic.2.jpg')
print("图像手绘化已完成")
七、使用matplotlib绘制sinx,cosx图像
from matplotlib import pyplot as plt
import numpy as np
plt.figure(figsize=(4,2))#生成的图片的大小
x = np.linspace(-2 * np.pi,2*np.pi,100)#设置一个序列(-2pi,2pi,之间设置100个点)
y = np.sin(x)#需要绘制的函数
y1 = np.cos(x)
plt.ylim(-1,1)#限制y轴的范围
plt.xlim(-4,4)#x轴的范围
plt.xlabel("X")#x轴的名称(显示在轴的下边)
plt.ylabel("Y")#y轴的名称(显示在轴的左边)
plt.title("sinx cosx ")#图像标题 在图像的上面
plt.plot(x,y,label="sinx")#根据函数坐标绘制折线图
plt.plot(x,y1,label = "cosx")#根据函数坐标绘制折线图
plt.text(1,1,"Text",fontdict={'size':10,'color':'g'})
plt.annotate('sin(np.pi)=',xy =(-np.pi,0),xytext=(-np.pi,2),fontsize=10,
arrowprops = dict(facecolor='purple',shrink=0.01))#设置注释
plt.show()
p