《利用Python进行数据分析》书籍第四章 Numpy基础:数组与向量化计算

前言

《利用Python进行数据分析》第四章介绍了numpy的基础应用,其中它在数组上的应用使我印象很深刻,并且在数据分析中应用很广泛。

目录

1.多维数组对象
2.快速的逐元素数组函数
3.使用数组进行面向数组编程
4.使用数组进行文件输入和输出
5.线性代数
6.示例:随机漫步的生成

正文

**

1.多维数组对象

**
生成一个6*3的随机数组

IN []: arr = np.random.randn(6, 3)
	   arr
[Out]: array([[-1.60504942,  0.83249693,  0.99075717],
       [ 0.53067705,  0.84047313,  0.37179762],
       [ 0.61024516, -1.74693451,  0.17061718],
       [ 0.78270522, -1.23342501, -0.42861251],
       [-0.48350215,  0.19488044, -0.4704741 ],
       [-0.38717591, -0.63085269, -0.92930177]])

可以通过array函数将序列型对象生成Numpy数组
这里的示例生成一个223的数组

IN [] : arr3d = np.array([[[1, 2, 3],[4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])
		arr3d
[Out]: array([[[ 1,  2,  3],
        [ 4,  5,  6]],
       [[ 7,  8,  9],
        [10, 11, 12]]])

数组元素的类型可以使用 dtype属性来指定
Numpy数组算术
在这里值得注意的一点是,不同尺寸的数组间的操作,会用到广播特性。在这个本书的附录中将会讲到。
相同尺寸的数组间的元素遵循线性代数中数组的基本运算规则
基础索引与切片
基础索引就是跟其他语言数据的索引一样,在[]中写入索引值,将获取该索引对应元素的值。
不过数组的切片与列表的切片有不同之处

区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并不是被复制了,任何对于视图的修改都会反映到原数组上。

如果要想得到的是切片的拷贝,要使用copy函数
另外,对数组中的元素的进行索引返回的也是视图,对于刚才的223的数组来说,[?,?,?]索引域中的索引值分别对应223的每一个维度

IN []: arr3d[0]
[Out]: array([[1, 2, 3],
       [4, 5, 6]])

数组的布尔索引在数据分析中应用的也很多,它的原理是对这一个数组进行遍历,按照给定的条件筛选数组中的元素,满足条件的即返回。使用布尔索引生成的是数据的拷贝。
数组的转置和转轴
转置

IN []: arr = np.arange(15).reshape((3, 5))
	   arr
[Out]: array([[ 0,  1,  2,  3,  4],
      		  [ 5,  6,  7,  8,  9],
      		  [10, 11, 12, 13, 14]])
IN [] :  arr.T
[Out]: array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

关于数组的转轴,在学习这一块知识的时候我很难理解,这里我是看到网上一篇文章Python numpy.transpose 详解才理解的
根据这篇文章形象化的解释,我自己的理解是:上面代码中的arr数组,比如说元素1它的索引是[0, 1]其中前面一个索引域是0轴,后面的为一轴,现在进行轴变换,那么元素1的索引变成了[1, 0],但是它的索引域的含义是不变的,可是对应的值变换了,索引将变化前的索引为[1, 0]的元素5替换成了1

2.快速的逐元素数组函数

IN [] : arr = np.random.randn(7)*5
		arr
[Out]:array([ 8.37010464, -0.09968331,  0.01240594, -2.65865996,  7.27590321,
        0.0255119 , -0.57315897]) 
IN [] : np.sqrt(arr, arr)
[Out]: array([2.89311331,        nan, 0.11138194,        nan, 2.69738822,
       0.15972446,        nan])

这里对数组逐元素开根,对于小于0的元素做开根运算用缺省值代替

3.使用数组进行面向数组编程

数学和统计方法
基础的数组统计方法有:sum,mean,std,var,min,max等,这些统计方法使用非常频繁,为数据分析带来了很大的便利
计算数组中所有元素的和

IN [] : arr = np.random.randn(5, 4)
		arr.sum()
[Out]: -0.9955883629817042

计算数组中所有元素的平均值

IN [] : arr.mean()
[Out]: -0.04977941814908521

如果向函数中传入axis=1代表的含义是按照列轴向统计,axis=0代表的是按照行轴向统计。arr.mean(axis=1)就是计算每一列的平均值

4. 广播

IN [] : arr = np.arange(5)
		arr
[Out]: array([0, 1, 2, 3, 4])
IN [] : arr * 4
[Out]: array([0, 4, 8, 12, 16])

这里标量值4已经被广播给乘法运算中的所有元素了,这段代码就是利用了Python数组的广播机制对每个元素的值乘4。

IN [] : arr = np.random.randn(4, 3)
		arr
[Out] : array([[-0.19531449, -0.10463109, -0.24440308],
       [ 2.13964106, -0.30258211, -0.65737959],
       [-0.29235519,  0.17459244, -0.84254349],
       [-0.27701557,  0.0493323 ,  0.1388859 ]])
IN [] : arr.mean(0)#求每列的平均值
[Out] : array([ 0.34373895, -0.04582211, -0.40136006])
IN [] : demeaned = arr - arr.mean(0)
		demeaned
[Out] : array([[-0.53905345, -0.05880898,  0.15695699],
       [ 1.7959021 , -0.25675999, -0.25601953],
       [-0.63609414,  0.22041456, -0.44118342],
       [-0.62075452,  0.09515442,  0.54024597]])

arr是一个4x3的数组,arr.mean(0)是一个1x3的数组,将两个数组进行减法元素的时候,广播体制会将arr.mean(0)数组按照行进行广播变成一个4x3的数组进行运算
例:
在这里插入图片描述
同理也可按照列进行广播
广播的规则

如果对于每个结尾维度(即从尾部开始的),轴长度都匹配或者长度都是1,两个二维数组就是可以兼容广播的。之后,广播会在丢失的或长度为1的轴上进行。

广播必须满足其中一个数组的维度中有一个维度为1,然后广播就是在这个维度为1的轴上进行。

猜你喜欢

转载自blog.csdn.net/Mr_Liuzhongbin/article/details/89187522