python数据分析 numpy库的学习(1)
因为pandas的后续深入数学计算一定要用到numpy的各种数学表达式,所以接下来就开始深入介绍numpy的数据结构、基本操作以及numpy的常用数学公式和线性代数操作。这一篇先讲python数组整体的操作,不涉及对单个数据的操作。

numpy是python种用于科学计算的基础第三方库,其核心数据结构是多维数组,由此衍生出来的还有矩阵等。其还提供了多种可以用于高级数学计算的函数,包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
相较于python中由列表导出的原生数组,numpy的ndarray对象有很大差异:
1.ndarray对象是静态的,不能增加元素的,修改会生成一个新对象并删除原有对象;
而原生数组是列表,是可以这样操作的。
2.ndarray中的对象都必须拥有相同数据类型,因此内存大小也都相同。
3.ndarry对象由于底层运算是由C实现的,所以在大规模数据操作上比原生数组效率更高。
操作代码列示:
'''这里先介绍ndarray对象的属性,再介绍操作''' arr=[[1,2,3], [4,5,6], [7,8,9]] ndarr=np.array(arr) '''print(ndarr.ndim) #描述数据的维数,这里是二维表,以后还有三维四维表 print(ndarr.shape) # 描述数组的形状,前行后列 print(ndarr.size) #描述数组数据量的数值 print(ndarr.dtype) #描述数组中元素的类型 print(ndarr.itemsize) # 数组中每个元素的字节大小''' #下面开始介绍ndarray对象的创建方法 '''print(np.array([1,2,3])) #这个方法可以将所有序列对象,列表、元组等都变成array对象 # np.asarray对象在将本来就是ndarray的对象转换时能不占据内存 print(np.zeros(5)) # 创造一个指定长度的全0数组 print(np.ones(5)) # 创造一个指定长度的全1数组 #如果要指定形状的话,内部的数值要用列表包裹 print(np.ones([3,4,5])) #多维数据也就是多了一层[]而已 print(np.zeros_like(ndarr)) #传入一个数组对象,创造一个同形状的全0数组 print(np.ones_like(ndarr)) #传入一个数组对象,创造一个同形状的全1数组''' '''print(np.empty([2,4])) #指定形状创造一个空表,随机填充一点字节进去 #np.empty_like()的操作也一样 print(np.full([4,4],8)) #这就是指定数字后构建一个指定形状的数组 # np.full_like()就是旧调重弹了 print(np.eye(4)) #创造一个n×n的单位阵 print(np.identity(5)) #效果同上 print(np.random.randn(2,3)) #利用random库随机构建数组,根据具体需求选择函数 print(np.arange(0,10,2)) #在给定区间内有序均匀选取值构成一维列表 print(np.linspace(3,13,4)) # 将首位数字n等分然后输出成一维数组 def get(x,y): return x+y #这里调用函数不需要导入数据,而是对象自己从N开始算数 print(np.fromfunction(get,(4,5),dtype=np.int))''' #还有一个调用二进制的函数我就不贴了因为不是很有必要 #下面简要介绍一些有关数据类型的操作 #print(ndarr.dtype) 由这个我们知道ndarr的类型是int32 #而数组中可以用astype的方法来更改数据类型 '''ndarr = ndarr.astype(np.float32) print(ndarr) #这样就完成了数据结构的更改''' # 而numpy是可以自定义类型的,想了解可以去看numpy中文库 '''下面开始介绍对数组的增删查改操作 首先介绍索引操作,numpy的索引是[]符号 对于一维数组,只需要一个索引值 t=np.arange(0,10,2) print(t[3]) #而对于二维数组,目前只讨论这个,需要两个位置的数 numr=np.arange(0,36).reshape(6,6) print(numr[2,2]) #表示第i行第j列 print(numr[2,[2,3]]) #表示第i行第[j,k]列 print(numr[[2,3],[2,3]]) #作为索引操作的一种是切片,一维数组切片基本语法是[i:j:k],依然是左闭右开区间,k是步长 a=np.arange(9) print(a[0:8:2]) print(a[:8]) print(a[:(-7)]) #负数索引记得加括号,利用这可以将数组翻转 #多维切片[:,:,],前面对应行,后面对应列,最后是步长''' #还可以采用花式索引的方式,利用列表数组进行筛选 numr=np.arange(0,36).reshape(6,6) '''print(numr[[3,2,5]]) #直接取出多少行 print(numr[[1,2,3],[3,4,5]])''' #这里行列是一一对应的,取出的是确定位置上的值 '''花式索引是对多维数组进行操作的一个很重要的工具 其索引值是一个数组,即使只生成一个值也是一个向量 花式索引利用的是拷贝方法,生成一个新数组,对原数组没有影响 print(numr[[1, 2, 3]][:, [1, 2, 3]]) ''' #对一维数组的增删改操作按照普通列表的操作就可以了,insert append drop del等操作都可以 #对多维数组进行行列的操作就设计到对整个数组形变,这个放着一起讲 #对一般的数组进行形变就用reshape函数就好,但要满足行列乘积不变 '''print(numr.reshape((4,9),order='F')) '''#f表示是从列而不是行开始读取,c表示从行开始 #这里介绍如何把多维表拉平 '''print(numr.flatten(order='C')) #按行 print(numr.flatten(order='F')) #按列 print(numr.ravel()) #效果一样''' #这里介绍怎样把数据合并,也就是在数组增添数据 #两个数组拼在一起,必须要有相同的维度,也就是[]的数量 '''brr=np.array([[10,199,277]]) print(np.concatenate((arr,brr))) #当axis=1时可以从列拼,但是要保证维度一样 print(np.concatenate((arr,brr.T),axis=1)) #转置一下就好 #下面时行拼起来的函数 print(np.vstack((arr,brr))) print(np.row_stack((brr,arr))) #下面是列拼起来的函数 print(np.hstack((arr,brr.T))) print(np.column_stack((brr.T,arr))) #下面是把两个数组就硬拼起来成一个更高维数组 #print(np.dstack((a,b))),但前提是两个数组形状相同''' #下面介绍数组的拆分 '''print(np.split(ndarr,3,axis=0)) #横着切和竖着切的区别 print(np.split(ndarr,3,axis=1)) print(np.hsplit(ndarr,3)) #竖切 print(np.vsplit(ndarr,3)) #横切''' #最后一点内容介绍数组的重复 print(np.repeat(np.arange(4),3)) print(np.repeat(np.arange(4),[2,3,4,5])) #可以利用数组指定每个元素的重复次数 print(np.repeat(ndarr,3,axis=1)) #按列重复,不指定轴会自动拉平再重复
浙公网安备 33010602011771号