科学计算与可视化

一.numpy库学习笔记

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示矩阵(matrix))。

一个用python实现的科学计算,包括:

1、一个强大的N维数组对象Array;

2、比较成熟的(广播)函数库;

3、用于整合C/C++和Fortran代码的工具包;

4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。

 

二.matplotlib库学习笔记

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。

Matplotlib基础知识:
1.Matplotlib中的基本图表包括的元素
x轴和y轴
水平和垂直的轴线
x轴和y轴刻度
刻度标示坐标轴的分隔,包括最小刻度和最大刻度
x轴和y轴刻度标签
表示特定坐标轴的值
绘图区域
实际绘图的区域
2.hold属性
hold属性默认为True,允许在一幅图中绘制多个曲线;将hold属性修改为False,每一个plot都会覆盖前面的plot。
但是目前不推荐去动hold这个属性,这种做法(会有警告)。因此使用默认设置即可。
3.网格线
grid方法
使用grid方法为图添加网格线
设置grid参数(参数与plot函数相同)
.lw代表linewidth,线的粗细
.alpha表示线的明暗程度
4.axis方法
如果axis方法没有任何参数,则返回当前坐标轴的上下限
5.xlim方法和ylim方法
import numpy as np
from PIL import Image

class picture:
    
    def __init__ (self,position):
        self.position = position

    def Hand_drawn_style(self):
        vec_el = np.pi/2   # 光源的俯视角度,弧度值
        vec_az = np.pi/3    # 光源的方位角度,弧度值
        depth = 6          # 深度权值,值越小背景区域越接近白色,值越大背景区域越接近黑色
        im = Image.open(self.position).convert('L')     # 打开图像并转变为灰度模式
        a = np.asarray(im).astype('float')
        grad = np.gradient(a)              # 取图像灰度的梯度值
        grad_x, grad_y = grad              # 分别取图像的横纵梯度值
        grad_x = grad_x * depth / 100.
        grad_y = grad_y * depth / 100.
        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轴的影响
        A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
        uni_x = grad_x/A
        uni_y = grad_y/A
        uni_z = 1./A
        a2 = 255*(dx * uni_x + dy * uni_y + dz * uni_z) # 光源归一化
        a2 = a2.clip(0, 255)                 # 预防溢出
        im2 = Image.fromarray(a2.astype('uint8'))       # 重构图像
        im2.save('猫和老鼠_.jpg') # 保存图像
        im2.show()                # 显示图像

if __name__ =='__main__':
    position = '猫和老鼠1.jpg'
    picture(position).Hand_drawn_style()

 

 

 

 

除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.sans-serif']=['SimHei']
labels=np.array(['高代','数分','python','解几','数据结构'])
nAttr=5
Python=np.array([79,84,80,71,85])
angles=np.linspace(0,2*np.pi,nAttr,endpoint=False)
Python=np.concatenate((Python,[Python[0]]))
angles=np.concatenate((angles,[angles[0]]))
fig=plt.figure(facecolor="white")
plt.subplot(111,polar=True)
plt.plot(angles,Python,'bo-',color='g',linewidth=2)
plt.fill(angles,Python,facecolor='g',alpha=0.2)
plt.thetagrids(angles*180/np.pi,labels)
plt.figtext(0.52,0.95,'2019310143045 菜的成绩表',ha='center')
plt.grid(True)
plt.savefig('dota_radar.JPG')
plt.show()

 

 

import numpy as np
import matplotlib
import scipy.stats
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

if __name__ == "__main__":
    # 期望0,标准差1,条数50
    mu, sigma, num_bins = 0, 1, 500
    # 1M个随机数
    x = mu + sigma * np.random.randn(10000)

    # 正态分布的数据, 颜色的透明度0.5
    n, bins, patches = plt.hist(x, num_bins, density=True, facecolor='blue', alpha=0.5)
# 直方图函数,x为x轴的值,normed=1表示为概率密度,
#即和为一,绿色方块,色深参数0.5.返回n个概率,直方块左边线的x值,及各个方块对象
    # 拟合曲线
    y = scipy.stats.norm.pdf(bins, mu, sigma)
    plt.plot(bins, y, 'r--')
    plt.xlabel('Expectation')
    plt.ylabel('Probability')
    plt.title('histogram of normal distribution: $\mu = 0$, $\sigma=1$')

    plt.subplots_adjust(left=0.15) #左边距
    plt.grid(True)  #打开网格线
    plt.show()

 

 

posted @ 2020-05-06 16:30  cjl1124  阅读(153)  评论(0)    收藏  举报