阅读 35

用python做数据分析第一个包numpy

主次主要讲的是numpy的常用函数,就对于我而言numpy的主要作用是创建数组和随机数和一些数学运算,处理数据由pandas去完成,画图也有其他包比如matplotlib,seaborn 首先来说的是数组的创建,废话不多说看代码然后再来解释 一 array的创建

ar_1=np.array([1,2,3,4,5])
ar_2=np.array([[1],[2],[3]])
复制代码

如图所示,array的作用就是自己手动创建自己想要的数组,像C一样去创建几维的数组有自己决定。多维数组ndarray,数组的维度称之为秩(rank),比如一数组的秩为1,二维数组的秩为2 一次类推

二 array函数的基本用法

print(ar_2.ndim)#输出数组秩的个数,结果为2
print(ar_2.shape)#可以理解为输出数组的形状,ar_2输出结果为(3,1)
print(ar_2.size)#输出数组元素的总数,ar_2的输出结果为3,(3*1=3)
print(ar_2.dtype)#输出数组的数据类型,(注意,type()是函数,而dtype是numpy的一个方法)

复制代码

三 array的不规则创建

ar3 = np.array([[1,2,3],('a','b','c')])   # 二维数组:嵌套序列(列表,元祖均可)
ar4 = np.array([[1,2,3],('a','b','c','d')])   # 注意嵌套序列数量不一会怎么样
复制代码

array里面的数据可以是元祖数组生成器等等,但是要注意的是,当array两个元祖或者数组的元素个数不一样时,他是秩将会是一而不是二

四 利用arange()函数创建数组

print(np.arange(10))    # 返回0-9,整型
print(np.arange(10.0))  # 返回0.0-9.0,浮点型
print(np.arange(5,12))  # 返回5-11
print(np.arange(5.0,12,2))  # 返回5.0-12.0,步长为2
复制代码

看图片可以知道,当只给出一个参数时,生成的数从0开始 两个参数则数左闭右开的数组范围 三个参数时,第三个代表的是步长,也就是说在5到11这些数字中,当步长为2时,他会开始数,第一个数字5,走两步是7再走两步是9一次类推

函数linspace,zeros,ones,eyes

#np.linspace在2-3之间等距离去10个数
ar0 = np.linspace(2.0, 3.0,10)
print(ar0)
#np.zeros()生成全部为0的矩阵
ar1 = np.zeros(5)  
ar2 = np.zeros((2,2), dtype = np.int)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
print('------')
#zeros_like()根据其他数组的维度来创建0矩阵
ar3 = np.array([list(range(5)),list(range(5,10))])
ar4 = np.zeros_like(ar3)
print(ar4)
#np.ones跟zeros类似就不讲了
ar5 = np.ones((3,3))#注意有两个括号
ar7 = np.ones_like(ar3)
print(ar5)
print(ar7)
#创建对角矩阵
复制代码

着几个函数了解就行也不难记住

# 矩阵形状的改变与转置:.T/.reshape()/.resize()

# 数组形状:.T/.reshape()/.resize()

ar2 = np.ones((5,2))
print(ar2,'\n',ar2.T)
# .T方法:转置,例如原shape为(3,4)/(2,3,4),转置结果为(4,3)/(4,3,2) → 所以一维数组转置后结果不变

ar4 = np.zeros((4,6)).reshape(3,8)   # 用法2:生成数组后直接改变形状
ar5 = np.reshape(np.arange(12),(3,4))   # 用法3:参数内添加数组,目标形状
#reshape改变数组的形状,但是要注意的是使用reshape矩阵的元素个数得相同

ar6 = np.resize(np.arange(5),(3,4))
print(ar6)
# numpy.resize(a, new_shape):返回具有指定形状的新数组,如有必要可重复填充所需数量的元素。
# 注意了:.T/.reshape()/.resize()都是生成新的数组!!!
复制代码

数组的拷贝(深复制和浅复制)

# 数组的深复制

ar1 = np.arange(10)
ar2 = ar1
print(ar2 is ar1)
ar1[2] = 9
print(ar1,ar2)
# 回忆python的赋值逻辑:指向内存中生成的一个值 → 这里ar1和ar2指向同一个值,所以ar1改变,ar2一起改变
# 数组的浅复制
ar3 = ar1.copy()
print(ar3 is ar1)
ar1[0] = 9
print(ar1,ar3)
# copy方法生成数组及其数据的完整拷贝
复制代码

可以看到直接复制的话两个变量是指向同一个地址的,也就是说ar1,ar2任意一个数组改变都会使两个变量一起改变,输出结构ar1 is ar2结构为TRUE 。当使用copy()函数复制时,两个创建了新的数组,也就是说这两个数组的地址指向不同,所以两个数组在物理地址上来说没有任何关系,也就说他们两个是互不影响的。

数组的简单运算

#astype()
ar=np.arange(10)
ar.astype(np.float)
#转换数组的数据类型

#数组要是整型或者浮点型,当数组进行运算时,所有的数字都会改变
print(ar+2)#结果为[2,3,4,5,6,7,8,9,10,11]
print(ar-2)
print(ar*2)
print(ar/2)
print(ar**2)

print(ar.mean())  # 求平均值
print(ar.max())  # 求最大值
print(ar.min())  # 求最小值
print(ar.std())  # 求标准差std
print(ar.var())  # 求方差var
print(ar.sum(), np.sum(ar,axis = 0))  # 求和,np.sum() → axis为0,按列求和;axis为1,按行求和
print(np.sort(np.array([1,4,3,2,5,6])))  # 排序
复制代码

切片的内容跟字符串切片的类似我就不讲了

数组的堆叠与拆分

水平堆叠

a = np.array([[1],[2],[3]])   # a为二维数组,3行1列
b = np.array([['a'],['b'],['c']])  # b为二维数组,3行1列
ar2 = np.hstack((a,b))  # 注意:((a,b)),这里形状必须一样
#注意水平堆叠时,两个数组的秩必须相同。但是以为数组是例外,不一样也可以
复制代码

垂直堆叠

a=np.arange(2,5)
b=np.arange(5,8)
ar1=np.vstack((a,b))
#两个数组的秩必须相同,长度可以不同
复制代码

总结:在进行堆叠时,必须保证两个数组的维度相同,水平堆叠时数组的形状必须相同,竖直堆叠时,西航渡可以不一样

拆分

s=np.arange(16).reshape(4,4)
ar1=np.hspilt(s,4)
#水平拆分,注意拆分后为list,也就是说numpy的函数,shape,等方法不可用

竖直拆分
ar2=np.vsplit(s,4)
#拆分后一样为list
复制代码

随机数的生成

随机数的生成是进行数据分析的重要辅助工具,需要重点掌握

一:符合正太分布的随机数

ran=np.random.normal((4,4))
# 生成一个标准正太分布的4*4样本值

# randn
sample1=np.random.rand(10)
sample2=np.random.randn(10,4)
#生成一个符合正太分布的样本,参数里面的数字是数组的形状
复制代码

二 符合均匀分布的随机数

#rand函数

a=np.random.rand()
b=np.random.rand(4)
c=np.random.rand(2,3)
#生成一个符合正太分布的样本,参数里面的数字是数组的形状

#randint函数

flag=np.random.randint(low=4,high=10,size=10)
#生成10个4-9之间的随机数,符合均匀分布,并且随机数只能整型
#记住low的值不能大于high,
t=np.random.randint(3)
#生成一个0-2之间的随机数

复制代码

大概numpy比较常用的函数就在这里啦,希望能帮到你们呀

要想自己熟悉使用一定要自己动手去做,可能别人写代码永远都是别人的

关注下面的标签,发现更多相似文章
评论