发布时间:2023-06-22 18:30
《利用Python进行数据分析》第四章介绍了numpy的基础应用,其中它在数组上的应用使我印象很深刻,并且在数据分析中应用很广泛。
1.多维数组对象
2.快速的逐元素数组函数
3.使用数组进行面向数组编程
4.使用数组进行文件输入和输出
5.线性代数
6.示例:随机漫步的生成
**
**
生成一个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
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的元素做开根运算用缺省值代替
数学和统计方法
基础的数组统计方法有: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)就是计算每一列的平均值
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的轴上进行。
OceanBase 3.2.3 发版|HTAP引擎全面升级,TPC-H性能10倍提升~
[ThinkPHP5]分页与having同时使用时报错的解决方法
谁是你心目中最可爱的老师,好的老师不是改变你,而是帮助你认识自己
【Verilog语法1】加载存储器$readmemh和$readmemb函数的使用
AAAI2018中的自注意力机制(Self-attention Mechanism)
2019史上最全java面试题题库大全800题含答案(面试宝典)
html中el日期格式化,【CSS】element-ui中的el-date-picker组件中某一日期上方多渲染一个字?...