numpy学习笔记2:面向数组编程。

面向数组的编程

面向数组的编程是以向量化代替使用繁杂的Loop循环。
下面是一个例子,我们要对一个普通网格的数值计算$sqrt(x^2 + y^2)$

1
2
import numpy as np
points = np.arange(-5, 5, 0.01) # 1000个元素的从-5到5到等差数列

meshgrid 的使用方法:
meshgrid函数用两个坐标轴上的点在平面上画格。[X,Y] = meshgrid(x,y) 将向量x和y定义的区域转换成矩阵X和Y,这两个矩阵可以用来表示mesh和surf的三维空间点以及两个变量的赋值。其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制。

1
xs, ys = np.meshgrid(points, points)    #因为参数相同,所以xs和ys也是相同的
1
ys
array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
       ..., 
       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])
1
z = np.sqrt(xs ** 2 + ys ** 2)
1
z
array([[ 7.07106781,  7.06400028,  7.05693985, ...,  7.04988652,
         7.05693985,  7.06400028],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       ..., 
       [ 7.04988652,  7.04279774,  7.03571603, ...,  7.0286414 ,
         7.03571603,  7.04279774],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568]])

可以将该矩阵视觉化

1
2
3
import matplotlib.pyplot as plt
import pylab #不引入这个库,单纯imshow不显示图像,不知为何
plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x81ffbf0>
1
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
Text(0.5,1,'Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values')
1
pylab.show() #这样才能显示图像

png