科学计算和可视化

Posted on 2020-05-06 20:59  我来写作业了  阅读(595)  评论(0)    收藏  举报

                                              科学计算和可视化

科学计算可视化(简称可视化,英文是Visualization in Scientific Computing,简称ViSC)是计算机图形学的一个重要研究方向,是图形科学的新领域

一、学习笔记

1、NumPy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

引用:import numpy

NumPy 的数组中比较重要 ndarray(表示数组) 对象属性有:

属性说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data

包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

ndarray.ndim

ndarray.ndim 用于返回数组的维数,等于秩。

实例

import numpy as np a = np.arange(24) print (a.ndim) # a 现只有一个维度 # 现在调整其大小 b = a.reshape(2,4,3) # b 现在拥有三个维度 print (b.ndim)

输出结果为:

1
3

ndarray.shape

ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。

ndarray.shape 也可以用于调整数组大小。

实例

import numpy as np a = np.array([[1,2,3],[4,5,6]]) print (a.shape)

输出结果为:

(2, 3)

调整数组大小。

实例

import numpy as np a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2) print (a)

输出结果为:

[[1 2]
 [3 4]
 [5 6]]

NumPy 也提供了 reshape 函数来调整数组大小。

实例

import numpy as np a = np.array([[1,2,3],[4,5,6]]) b = a.reshape(3,2) print (b)

输出结果为:

[[1, 2] 
 [3, 4] 
 [5, 6]]

NumPy 创建数组

ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。

numpy.empty

numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:

numpy.empty(shape, dtype = float, order = 'C')

参数说明:

参数描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

下面是一个创建空数组的实例:

实例

import numpy as np x = np.empty([3,2], dtype = int) print (x)

输出结果为:

[[ 6917529027641081856  5764616291768666155]
 [ 6917529027641081859 -5764598754299804209]
 [          4497473538      844429428932120]]

注意 − 数组元素为随机值,因为它们未初始化。

numpy.zeros

创建指定大小的数组,数组元素以 0 来填充:

numpy.zeros(shape, dtype = float, order = 'C')

参数说明:

参数描述
shape 数组形状
dtype 数据类型,可选
order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组

实例

import numpy as np # 默认为浮点数 x = np.zeros(5) print(x) # 设置类型为整数 y = np.zeros((5,), dtype = np.int) print(y) # 自定义类型 z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')]) print(z)

输出结果为:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[(0, 0) (0, 0)]
 [(0, 0) (0, 0)]]

numpy.ones

创建指定形状的数组,数组元素以 1 来填充:

numpy.ones(shape, dtype = None, order = 'C')

参数说明:

参数描述
shape 数组形状
dtype 数据类型,可选
order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组

实例

import numpy as np # 默认为浮点数 x = np.ones(5) print(x) # 自定义类型 x = np.ones([2,2], dtype = int) print(x)

输出结果为:

[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]

numpy.arange

numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:

numpy.arange(start, stop, step, dtype)

根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。

参数说明:

参数描述
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1
dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

实例

生成 0 到 5 的数组:

实例

import numpy as np

x = np.arange(5) 
print (x)

输出结果如下:

[0  1  2  3  4]

设置返回类型位 float:

实例

import numpy as np

# 设置了 dtype
x = np.arange(5, dtypefloat) 
print (x)

输出结果如下:

[0.  1.  2.  3.  4.]

设置了起始值、终止值及步长:

实例

import numpy as np
x = np.arange(10,20,2) 
print (x)

输出结果如下:

[10  12  14  16  18]
 

2、NumPy Matplotlib

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

 

实例

实例

import numpy as np
from matplotlib import pyplot as plt

x = np.arange(1,11)
y2  * x5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y) plt.show()

以上实例中,np.arange() 函数创建 x 轴上的值。y 轴上的对应值存储在另一个数组对象 y 中。 这些值使用 matplotlib 软件包的 pyplot 子模块的 plot() 函数绘制。

图形由 show() 函数显示。

为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。 可以使用以下格式化字符。

字符描述
'-' 实线样式
'--' 短横线样式
'-.' 点划线样式
':' 虚线样式
'.' 点标记
',' 像素标记
'o' 圆标记
'v' 倒三角标记
'^' 正三角标记
'<' 左三角标记
'>' 右三角标记
'1' 下箭头标记
'2' 上箭头标记
'3' 左箭头标记
'4' 右箭头标记
's' 正方形标记
'p' 五边形标记
'*' 星形标记
'h' 六边形标记 1
'H' 六边形标记 2
'+' 加号标记
'x' X 标记
'D' 菱形标记
'd' 窄菱形标记
'|' 竖直线标记
'_' 水平线标记

以下是颜色的缩写:

字符颜色
'b' 蓝色
'g' 绿色
'r' 红色
'c' 青色
'm' 品红色
'y' 黄色
'k' 黑色
'w' 白色

要显示圆来代表点,而不是上面示例中的线,请使用 ob 作为 plot() 函数中的格式字符串。

实例

import numpy as np from matplotlib import pyplot as plt x = np.arange(1,11) y = 2 * x + 5 plt.title("Matplotlib demo") plt.xlabel("x axis caption") plt.ylabel("y axis caption") plt.plot(x,y,"ob") plt.show()

执行输出结果如下图:

二、制作雷达图

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3  
 4 # 中文和负号的正常显示
 5 plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
 6 plt.rcParams['axes.unicode_minus'] = False
 7  
 8 # 使用ggplot的绘图风格
 9 plt.style.use('ggplot')
10  
11 # 构造数据
12 values = [5,5,5,5,5,5,5]
13 feature = ['第一周','第二周','第三周','第四周','第五周','第六周','第七周']
14  
15 N = len(values)
16 # 设置雷达图的角度,用于平分切开一个圆面
17 angles=np.linspace(0, 2*np.pi, N, endpoint=False)
18 # 为了使雷达图一圈封闭起来,需要下面的步骤
19 values=np.concatenate((values,[values[0]]))
20 angles=np.concatenate((angles,[angles[0]]))
21  
22 # 绘图
23 fig=plt.figure()
24 ax = fig.add_subplot(111, polar=True)
25 # 绘制折线图
26 ax.plot(angles, values, 'o-', linewidth=2, label = '学号2019310143017')
27 # 填充颜色
28 ax.fill(angles, values, alpha=0.35)
29  
30 # 添加每个特征的标签
31 ax.set_thetagrids(angles * 180/np.pi, feature)
32 # 设置雷达图的范围
33 ax.set_ylim(0,5)
34 # 添加标题
35 plt.title('江某人的成绩单')
36  
37 # 添加网格线
38 ax.grid(True)
39 # 设置图例
40 plt.legend(loc = 'best')
41 # 显示图形
42 plt.show()

 

三、自定义手绘风

 1 from PIL import Image
 2 import numpy as np
 3 vec_el=np.pi/2.2
 4 vec_az=np.pi/4
 5 depth=10
 6 im=Image.open('C:/Users/Lenovo/Pictures/Camera Roll/广州夜景.jpg').convert('L')
 7 a=np.asarray(im).astype('float')
 8 grad=np.gradient(a)
 9 grad_x,grad_y=grad
10 grad_x=grad_x*depth/100.
11 grad_y=grad_y*depth/100.
12 dx=np.cos(vec_el)*np.cos(vec_az)
13 dy=np.cos(vec_el)*np.sin(vec_az)
14 dz=np.sin(vec_el)
15 A=np.sqrt(grad_x**2+grad_y**2+1.)
16 uni_x=grad_x/A
17 uni_y=grad_y/A
18 uni_z=1./A
19 a2=255*(dx*uni_x+dy*uni_y+dz*uni_z)
20 a2=a2.clip(0,255)
21 im2=Image.fromarray(a2.astype('uint8'))
22 im2.save('C:/Users/Lenovo/Pictures/Camera Roll/广州夜景.jpg')

原图:

手绘: