上篇文章中我们介绍了numpy中的常用函数,接下来我们演示在这些基础上如何进行数据计算。
numpy的一大优势是可以使用简洁的表达式对数组进行元素级计算,并且在速度上远快于编写循环。比如我们想对两个二维数组计算平方和的根。
首先我们使用meshgrid函数产生两个二维矩阵。
# In:points = np.arange(-5, 5, 0.02)x, y = np.meshgrid(points, points)y# Out:array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ], [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98], [-4.96, -4.96, -4.96, ..., -4.96, -4.96, -4.96], ..., [ 4.94, 4.94, 4.94, ..., 4.94, 4.94, 4.94], [ 4.96, 4.96, 4.96, ..., 4.96, 4.96, 4.96], [ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98]])
对两个数组使用表达式进行计算:
# In:z = np.sqrt(x**2 + y**2)z# Out:array([[7.07106781, 7.05693985, 7.04284034, ..., 7.02876945, 7.04284034, 7.05693985], [7.05693985, 7.04278354, 7.02865563, ..., 7.01455629, 7.02865563, 7.04278354], [7.04284034, 7.02865563, 7.01449927, ..., 7.00037142, 7.01449927, 7.02865563], ..., [7.02876945, 7.01455629, 7.00037142, ..., 6.986215 , 7.00037142, 7.01455629], [7.04284034, 7.02865563, 7.01449927, ..., 7.00037142, 7.01449927, 7.02865563], [7.05693985, 7.04278354, 7.02865563, ..., 7.01455629, 7.02865563, 7.04278354]])
使用matplotlib将结果可视化:
# In:import matplotlib.pyplot as pltplt.imshow(z, cmap = plt.cm.gray);plt.colorbar()plt.title("Image of z")plt.show()

使用numpy.where进行条件逻辑运算
首先我们生成三个数组:
# In:x = np.arange(5)y = x * 2cond = np.array([True, False, True, False, True])# 使用for循环result = [(x if c else y) for x, y, c in zip (x, y, cond)]result# Out:[0, 2, 2, 6, 4]
这里zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。这种写法在处理大数据上速度较慢,也无法应用在多维数组上。
如果我们使用np.where就可以解决这个问题,并且非常简洁:
# In:np.where(cond, x, y)# Out:array([0, 2, 2, 6, 4])
numpy提供了常用的统计函数,帮助我们快速地对数组进行统计分析,统计对象可以是整个数组,也可以是数组的某一个轴。
先生成一个随机数组,然后分别应用mean()和sum()
# In:arr = np.random.randn(5,4)arr# Out:array([[ 1.1704462 , -0.11859527, 0.08321196, 1.40887608], [ 1.87712025, 1.25918045, 0.03173632, 0.3329337 ], [-0.76264071, 1.12298795, 0.19634259, 0.08564058], [-2.64042929, -0.74391001, -0.36765911, -1.02825462], [-0.69439879, 0.05362188, 0.30314953, -2.23890435]])# In:print(arr.mean())print(arr.sum())# Out:-0.03347723349693536-0.6695446699387073
使用axis指定操作的某一轴后,相当于得到一个降一维的数组
# In:print(arr.mean(axis = 0))# Out:[-0.20998047 0.314657 0.04935626 -0.28794172]
这里指定axis = 0是对每一列求均值,指定axis = 1则可以对每一行进行操作。


使用sort对数组进行排序,排序时也可以指定轴。
# In:arr.sort(1)arr# Out:array([[-0.11859527, 0.08321196, 1.1704462 , 1.40887608], [ 0.03173632, 0.3329337 , 1.25918045, 1.87712025], [-0.76264071, 0.08564058, 0.19634259, 1.12298795], [-2.64042929, -1.02825462, -0.74391001, -0.36765911], [-2.23890435, -0.69439879, 0.05362188, 0.30314953]])
我的公 众 号:数据小白学习笔记,了解更多数据分析技巧。
