数据分析进阶
numpy
numpy提供了一种数组类型,高维数组,提供了数据分析的运算基础(业务表一般就是二维)
import numpy as np
导入numpy库,并查看numpy版本
np._version_
创建array
数据类型一致的一个连续的内存空间,python的列表list不要求数据类型一致
numpy的设计初衷是用于运算的,所以对数据类型进行统一化
如果传进来的列表包含不同的类型,则统一为同一类型,优先级:str>float>int
创建一个numpy的数组
array = np.array([1])
参数介绍:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- dtype数据类型,可选
- copy对象是否需要复制,可选
- order创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
- subok默认返回一个与基类类型一致的数组
- ndmin指定生成数组的最小维度
创建高维数组
1. * np.ones(shape,dtype=None,order='C')
以1填充的数组
shape =(m,n) m行n列 二维数组
shape = (m) m个元素的一维数组
shape = (m,) m个元素的一维数组
shape = (m,1) m行1列的二维数组
shape = (1,n) 1行n列的二维数组
`#构造一个5行3列的二维数组`
np.ones(shape=(5,3),dtype=np.int(8))
#构造一个长度为3的一维数组
np.ones(shape=(3))
2. * np.zeros(shape,dtype=float,order='C')
以0填充数组
3. * np.full(shape,fill_value,dtype=None,order='C')
fill_value是填充值,填充值填充数组
4. * np.eye(N,M=None,k=0,dtype=float)
单位矩阵的构造方式
对角线为1其他位置为0
N控制阶数,M和N默认相等,k控制对角线位移
5. np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
生成等差数列方法一
七时至,终止值,个数
np.linspace(0,10,10,endpoint=False)生成一个从0到9(因为endpoint为False)的等差数列,一共十个数
6. np.arrange([start,] stop, [step,] dtype=None)
生成等差数列方法二
七十至,终止值,步长
np.arrange(0,10,step=1)
生成一个0-9的数组
7. np.random.randint(low,high=None,size=None,dtype='|')
size相当于shape
生成随机整数
np.random.randint(0,100,size=(5,5))
8.正态函数分布
- np.randaom.randn(d0,d1,...,dn)标准正态分布
- np.random.normal()普通正态分布
标准
np.random.randn(3,5)
普通
np.random.normal(loc=170,scale=5,size=(5,3))
loc数学期望,scale方差
9. np.random.random(size=None)
生成0-1的随机小数,左闭右开
np.random.random(size=100)
np.random.random(5,3)
10. np.random.permutation(10)
生成0-9的随机无序整数索引
ndarray的属性
4个必记参数:
ndim:维度
shape:形状(各维度的长度)
size:总长度
dtype:元素类型
创建属性如何访问如何计算
array = np.array([1,4,6,8,9])
array.ndim #1
array.shape #
array.size #5
array.dtype # int
索引
`import numpy as np
#索引
data = np.array([[1,2,3],[4,5,6]])
#列表的访问方式在这里可以兼容
print(data[0][1])
#np特有的索引方式:用维度索引
print(data[0,1])
#用布尔值访问,使用bool列表作为索引
array1 = np.array([1,2,3,4,5])
print(array1>3) #返回一个bool列表[False False False True True]
#用布尔列表判断
print(array1[array1>3])`
切片
所有的切片都是开区间,左闭右开
`import numpy as np
#切片
array2 = np.random.randint(0,10,size=(5))
print(array2)
print(array2[0:3])
array3 = np.random.randint(0,100,size=(5,6))
#行切片
print(array3[0:2])
#列切片,不论多少维,每一个维度的切片范围都是用:表示,使用,分割,最后一个维度可以省略,但是被切片的维度之前的不能省
print(array3[:,0:2]) #0:2表示切前面两列,:,表示保留一个维度的所有并用逗号隔开`
变形
import numpy as np
#变形,reshape函数的参数是一个元组,元组乘积是数组的元素数量
arr = np.random.randint(0,10,size=(10))
print(arr)
print(arr.reshape(5,2))
级联
np.concatenate()
- 级联需要注意的点:
- 级联的参数是列表,一定要加上中括号或小括号
- 维度必须相同
- 形状相符
- 重点级联的方向默认是shape这个tuple的第一个值所代表的维度方向
- 可通过axis参数改变级联的方向
import numpy as np
#连接方式一
arr1 = np.random.randint(0,10,size=(3,3))
arr2 = np.random.randint(10,20,size=(3,3))
print(arr1)
print(arr2)
print(np.concatenate((arr1,arr2),axis=1))
#参数:tuple一个元组,数组名组成的元组;(默认数组之间纵向连接);axis连接方式,0是纵向连接,1是横向连接
#连接方式二,na.hstack与np.vstack,h=horizontal,v=certical
print(np.hstack((arr1,arr2)))
切分
切分与切片类似,但是返回值更多
与级联类似,三个函数完成切分工作
- np.split
- np.hsplit
- np.vsplit
import numpy as np
#np.split,直接指定切分的份数
arr = np.random.randint(0,100,size=(6,6))
print(arr)
print(np.split(arr,indices_or_sections=2))
print(np.split(arr,indices_or_sections=2,axis=1))
print(np.split(arr,indices_or_sections=[2,5],axis=1)) #切分成三部分,0-2,2-5,5-最后
print('-------------------------------------')
#np.hsplit,横向切分
print(np.hsplit(arr,indices_or_sections=2))
#np.vsplit,纵向切分
print(np.vsplit(arr,indices_or_sections=2))
副本
所有赋值运算不会为ndarray的任何元素创建副本,对赋值后的对象的操作也对原来的对象生效
可使用copy()函数创建副本
#副本
arr = np.random.randint(0,10,size=(3,5))
print(arr)
copy_arr = arr.copy()
print(copy_arr)
#cpoy不会更改原始值
浙公网安备 33010602011771号