科学计算和可视化
科学计算可视化(简称可视化,英文是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 用于返回数组的维数,等于秩。
实例
输出结果为:
1
3
ndarray.shape
ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。
ndarray.shape 也可以用于调整数组大小。
实例
输出结果为:
(2, 3)
调整数组大小。
实例
输出结果为:
[[1 2]
[3 4]
[5 6]]
NumPy 也提供了 reshape 函数来调整数组大小。
实例
输出结果为:
[[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"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
下面是一个创建空数组的实例:
实例
输出结果为:
[[ 6917529027641081856 5764616291768666155]
[ 6917529027641081859 -5764598754299804209]
[ 4497473538 844429428932120]]
注意 − 数组元素为随机值,因为它们未初始化。
numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
参数说明:
| 参数 | 描述 |
|---|---|
| shape | 数组形状 |
| dtype | 数据类型,可选 |
| order | 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组 |
实例
输出结果为:
[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 的列数组 |
实例
输出结果为:
[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 的数组:
实例
x = np.arange(5)
print (x)
输出结果如下:
[0 1 2 3 4]
设置返回类型位 float:
实例
# 设置了 dtype
x = np.arange(5, dtype = float)
print (x)
输出结果如下:
[0. 1. 2. 3. 4.]
设置了起始值、终止值及步长:
实例
x = np.arange(10,20,2)
print (x)
输出结果如下:
[10 12 14 16 18]
2、NumPy Matplotlib
Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
实例
实例
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) 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() 函数中的格式字符串。
实例
执行输出结果如下图:

二、制作雷达图
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')
原图:

手绘:

浙公网安备 33010602011771号