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)) #按列重复,不指定轴会自动拉平再重复

 

posted on 2020-03-17 17:23  张达铃  阅读(204)  评论(0)    收藏  举报

导航