基础了解(一)
主要涉及到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?