数据分析的Python快速先导课 三
python里面没有数组(矩阵)的概念,只有列表和元组。这就增加了时间和空间代价。这个问题由第三方包来弥补。
第三方包
- 目前有numpy(由C实现的)和array能弥补上面的问题。array比较少用,最常用的是numpy的ndarray模块。
- N维数组是通过Python的numpy的扩展模块udarray实现的。numpy的所有处理数据的函数都是udarray实现的。
- np.arange其实就是对python里面range函数的重写,速度会快一点。还有int函数,重写成了np.int。实际上,np几乎把python数据分析相关的功能都重写了。
myarray1 = np.zeros(shape = (2,15), dtype = np.int)
myarray
#在这里也是把zeros函数重写了
- 下面介绍ndarray
- 速度的提升- np.array是对类型进行数组转换,range()是自带的,arange是np自己写的。速度对比在这里。
2. 切片: fancy index。
rand = np.random.RandomState(30)
myarray = rand.randint(0,100,size = [7,7])
#myarray
#输出
array([[37, 37, 45, 45, 12, 23, 2],
[53, 17, 46, 3, 41, 7, 65],
[49, 45, 61, 35, 18, 18, 76],
[16, 6, 62, 27, 46, 45, 64],
[62, 11, 15, 23, 13, 50, 33],
[55, 28, 58, 91, 78, 57, 75],
[95, 44, 37, 75, 57, 39, 9]])
#做切片
m = myarray[[1,2],[3,4]]
#第index(1)行和第(2)行的第(3)列和第(4)列。
print(m)
#输出[ 3 18]
数组计算
浅拷贝和深拷贝
python本身是引用函数类的运算,变量名里面存的是数据的地址,因此默认的是浅拷贝的情况,在直接通过变量赋值时,改变后来的会同时改变前面的,这就是浅拷贝。如果在后面加一个.copy(),两个变量各自有自己的存储空间。
比如下图:
数组变换
- resize ,就地修改(inplace)
- reshape,原先的数据不会修改
- 轴变换:
变量名.swapaxes(0,1)
。第0维和第1维进行变化。不改变数组本身。可以先生成再赋值。比如变量名 = 变量名.swapaxes(0,1)
这样就会变化。 - 压平:
- 查元素数目的时候,有函数的方式,也有属性的方式。
np.shape(变量名)
,变量名.shape
。size是元素数目,shape是几行几列。
ndarray的运算
数组的切开
myarray5 = np.arange(1,21)
#array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
upper,lower = np.vsplit(myarray5.reshape(4,5),[3])#按照行来切切成两个部分
#upper,lower = np.hsplit(myarray5.reshape(4,5),[3])#按照列切成两个部分
print(upper)
print(lower)
#输出
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
[[16 17 18 19 20]]
数组的合并
- 按照列进行合并:保证行数一样。
np.hstack([第一块,第二块])
- 按照行进行合并:保证列数一样。
np.vstack([第一块,第二块])
- 也有比较复杂的写法,
np.concatenate((第一块,第二块),axis = 0)
ndarray的安全函数
主要在于对于缺失值的处理。
在adarray里面,缺失值被定义成float函数,可以跳过,因此事可以参加运算的。
ndarray的排序
针对矩阵有行排序和列排序
np.sort(myarray1,axis = 0)#按列排序
np.sort(myarray1,axis = 1)#按行排序