基础了解(一)

主要涉及到python相关数据分析库的基础了解

参考资料:http://nbviewer.jupyter.org/github/LearnXu/pydata-notebook/tree/master/Chapter-04/

其他:

https://github.com/BrambleXu/pydata-notebook

https://www.jianshu.com/p/04d180d90a3f

一、Numpy 基础

1、numpy 介绍

numpy是python数值计算领域很重要的包。主要有以下特点:

  • ndarray,一个有效的多维有效数组,能提供以数组为导向的快速数值计算和灵活的广播功能(broadcasting)

什么是“灵活的广播功能”?

简单讲就是两个维度不同的矩阵进行按位加减操作时,进行的兼容操作

相关介绍:https://blog.csdn.net/lanchunhui/article/details/50158975

  • 便利的数学函数

  • 用于读写/写入数据到磁盘的便利工具

  • 线性代数、随机数、傅里叶变换能力

  • 可以用C API来写C,C++或者FORTRAN

不解,这是什么操作?

2、数组对象

n维数组对象或者ndarray是numpy的关键特征

1、创建数组对象

  • np.array()

这里觉得很奇怪,为什么小数点后面是空格,而不是0?而且我发现[[1,2,3],[1,2]]这个数据居然不会报错,但是也很奇怪。

这个其实不奇怪,python中也有后面带有一个小数点的情况

  • arr.ndim

返回数组的行数

  • arr.shape

返回一个元组,包含数组的行数和列数

  • arr.dtype

一般在生成数组是,np.array()会自动匹配类型

有趣的是,我试过一个数组中加入字符串,也是可以的,只不过数组类型发生了变化,不是数字的而已。这是否说明这种数组类型,不仅可以处理数学操作,也可以实现一些其他数据类型的操作呢?

  • np.zeros(10)

生成一个array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

  • np.zeros((3,6))

同上

  • np.empty((2,3,2))

这个方法不能保证返回的数组中的数值都是0,有可能会返回某些垃圾数值,如下

  • np.arange(15)

生成array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

其他创建数组的函数

  • asarray:将传入数据转换为对应格式的ndarray,如果已经是目标的ndarray,则不copy

  • ones、ones_like:根据执行的格式和dtype创建一个全是1的数组;格局传入的数组格式,创建一个格式相同的全一数组

  • zeros、zeros_like:同上

  • empty、empty_like:创建新数组,只分配内存空间,但不填充任何值

  • eye、identity:创建N*N的单位矩阵(对角线为1,其余为0)

empty的例子前面出现过,其实是有值的,为什么说是没有值呢?另外,创建empty之后,如果输出值,有没有输出呢?

还有eye和identity应该有些差别吧?

2、ndarrays的数据类型

创建数据时,可以声明创建的数据类型

dtype才是numpy能灵活处理其他外界数据的原因。

类型介绍:

  • int7, uint8

  • int16, uint16

  • int32,uint32

  • int64, uint64

  • float16

  • float32

  • float64

  • float128

  • complex64

  • complex128

  • complex256

  • bool

  • object

  • string_

  • unicode_

转换数据类型:

  • ndarray.astype()

转换数据类型

在转换不同的数据类型时,需要格外注意,比如由float转为int时,会截断小数点后面的数值。

3、数组计算

数组之所以重要,是因为不用写for循环就能表达很多操作

4、基本的索引和切片

  • 切片

这里有个区别在numpy的array和python的list之间,list的切片是生成了一个新的list,修改是不会影响原本的list,但是array的切片创建的是一个视图,如果修改是会影响到原本的array的。

即便赋值给另一个变量,修改也会影响到原来的array的

如果需要复制的话,可以使用arr[5:8].copy

切片可以被赋值为数组,也可以被赋值为标量,当为标量的时候,所有切片数组中的元素都会变为标量的值。

  • 索引

索引很简单,就是普通理解的两种

  • 用切片索引

对于一个多维数组

提取出来之后,当然也可以赋值为标量或者数组,但是仍然这只是视图,会影响到原array的。

5、布尔索引

假设每一个名字对应data中的一行,我们希望提取出‘Bob’的那些行

然后就可以把这个布尔数组作为索引

注意:布尔数组的长度要和data数组的长度一样长

  • 否定有两种方式

第二种方式在反转已有的条件时,会很方便。

  • 多个布尔条件用布尔运算符&,|,另外python的and和or不管用

  • 修改值

这也太方便了吧!?

6、花式索引

  • 提取行

arr[[4, 3, 0, 6]]可以从数组中提取出第4、3、0、6行,然后组成新的数组,arr[[-3, -5, -7]]也可以,允许从后面找

  • 提取多个特定数值

arr[[1, 5, 7, 2], [0, 3, 1, 2]]可以从数组中提取第(1,0), (5,3), (7,1),(2,2)个数值,前者代表行数,后者代表列数,共四个数字,以数组的形式按顺序排列返回。

  • 提取一个矩形局域

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]这个较为复杂,首先[[1, 5, 7, 2]]这一部分将[0, 3, 1, 2]行提取出来,然后[:, [0, 3, 1, 2]]表示选中所有的行,但是列的顺序要按[0, 3, 1, 2]的顺序来排。

第二部分(变换列顺序)的使用感觉有些陌生

7、数组转置和轴交换

  • 数组转置

有两种方式,但注意的是转置是返回一个视图,而不是新的数组

计算矩阵乘法的时候经常会用到,np.dot()

  • 轴变换

对于多维数组,transpose会接受由轴数字组成的tuple,来交换轴

刚开始这段还没看懂,稍微有点复杂

转换的方式是把索引按照轴数字来变换,原本轴数字应该是(0,1,2),看arr的第一行是没有发生变化的,因为它的前两个数字都是0,而最后一行也没变,是因为,前两个索引数字都是1。

3、通用函数:快速点对点数组函数

在我的理解中,点对点的意思就是单独处理数组中的每个元素

1、一元通用函数

就是只处理一个数组的

这些函数可以接受一个可选参数作为输出,如果是原数组,就可以直接修改原数组。

常用一元函数

  • abs,fabs:计算整数,浮点数和复数的绝对值

  • sqrt: 平方根

  • square: 平方

  • exp: e**x

  • log,log10:

  • log2,logx:

  • sign:返回 -1, 0, 1

  • ceil:比元素大的数中最小的整数

  • floor: 比元素小的数中大的整数

  • rint:四舍五入

  • modf:

  • isnan:返回布尔值,判断是否是非数字

  • isfinite,isinf:

  • cos,cosh,sin:

  • sinh,tan,tanh:

  • arccos,arccosh:

等等

2、二院通用函数

  • np.maximum()

  • np.modf()

二元通用函数

  • add:

  • subtract:第一个减第二个

  • multiply:

  • divide,floor_divide:

  • power:

  • maximun,fmax:

  • minimum,fmin:

  • mod:模

  • copysign:把第二个的符号复制到第一个

比较

  • greater,greater_equal:

  • less,less_equal:

  • equal,not_equal:

  • logical_and:

  • logical_or:

  • logical_xor:

4、数组导向编程

向量化的数组运算比纯python同等程度的运算快很多

0、np.meshgrid(方法)

meshgrid函数用两个坐标轴上的点在平面上画网格。

np.linespace()方法很明显是将前面两个参数的距离按第三个参数的数值等分,然后得到一个数组。虽然我不知道np.meshgrid()到底什么意思,但它的效果就是把第一个数组的个数作为列数,然后把第二个数组的个数作为行数,然后把两个数组编程维度相同的矩阵,如上。

可以使用zip得到坐标点的数据

0、开始运算

然后还可以把图像画出来

1、像数组操作一样表示逻辑条件

numpy.where函数是一个向量版的三相表达式,x if condition else y

这样的缺点是处理较大数组时比较慢,其次是不能处理多维数组

np.where的第二和第三个参数不必是数组,

2、数学和统计方法

一些能计算统计值的数学函数能基于整个数组,或者沿着一个axis,比如sum,mean

示例

mean或sum这样的函数能接受axis作为参数,返回结果的维度更少

cumsum和cumprod不做汇总,而是产生一个中间结果的数组

对于多维数组,累加函数返回的是同样大小的数组

3、布尔数组的方法

sum可以用来计算布尔数组中有多少个true

还有any和all对布尔数组特别有用

4、排序

对于一维数组

多维数组可以按照axis排序

上面的方法会修改数组的顺序,如果使用np.sort()函数,则会生成一个新的排序后的结果。

5、唯一和其他集合逻辑

np.unique()返回不重复的值

np.inld()测试一个数组的值是否在另一个数组里,返回布尔数组

其他集合操作

  • intersectld(x,y):计算x和y中的重复元素

  • unionld(x, y):

  • setdiffld(x, y):

  • setxorld(x, y):

Last updated

Was this helpful?