Python数据科学库03(numpy)

Python数据科学库03

学习03

numpy学习

什么是numpy

一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算。

numpy基础

numpy创建数组(矩阵)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
查看数组的类型:
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述
查看数据的类型:
在这里插入图片描述
结果:
在这里插入图片描述
如果在创建数据的时候没有定义数据类型,则这里的64是会与系统64位相关。当电脑是32位时,就会是int32。

numpy中常见的更多数据类型
在这里插入图片描述

数据类型的操作

在这里插入图片描述
例子1:
在这里插入图片描述
在这里插入图片描述
例子2:
在这里插入图片描述
在这里插入图片描述
例子3:
在这里插入图片描述
在这里插入图片描述
例子4(布尔类型的数据):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
保留小数:
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

numpy数组的计算

数组的形状:

查看数组的形状:
在这里插入图片描述
其中a.shape可以查看数组的形状。
a.shape的结果中有几个数字,就表示a数组是几维数组。
即:上图中a.shape结果有两个数字(2, 6),说明a数组是二维数组。

修改数组的形状:
reshape是有返回值的修改,不会对原本的数据进行改动。
在这里插入图片描述
需要修改数组形状时,需要考虑通道数、行数、列数的乘积等于数组中数据的个数。
例如:在这里插入图片描述
其中reshape(2,3,4)中,2表示2层(2个通道)、3表示三行、4表示四列。其中234=24,与创建的numpy数组中元素个数相等。

在这里插入图片描述
a1 = np.arange(12)
a2 = a11.reshape(1,12)
print(a2.shape)
结果:(1, 12)
答:不是一维数组,是二维数组。

将数组转换成一维数组的方式:
在这里插入图片描述
第一种:
t6 = t5.reshape((t5.shape[0]*t5.shape[1], ))
第二种:
t6 = t5.flatten()

数组和数的计算:

numpy的广播机制造成的,在运算过程中,加减乘除的值被广播到所有的元素上面。
在这里插入图片描述
当numpy数组除以0时,即0做分母时,计算结果会出现两种,一个是nan (no a number),另一个是inf (infinite)。
在这里插入图片描述
在这里插入图片描述

数组和数组的计算

具有相同行列数的数组计算

在这里插入图片描述

不同行列数的数组计算

当只有一行或者一列的数组计算时,且只有一行或者一列的数组的行数或者列数要与计算的数组的行数或者列数保持相同。这样才能正常计算。
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
当行数或则列数超出原本数组的行数或则列数,则会报错。
在这里插入图片描述

广播原则

如果两个数组的**后缘维度(trailing dimension,即从末尾开始算起的维度)**的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

怎么理解呢?
可以把维度指的是shape所对应的数字个数
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?不能
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?能
shape为(3,3,2)的数组能够和(3,3)的数组进行计算么?能(因为在某一向量上是相等的)

轴(axis)

回顾 np.arange(0,10).reshape((2,5)), reshpe中2表示0轴长度(包含数据的条数)为2, 1轴长度为5, 2X5一共10个数据。

**举个例子:**求每列或每行的平均值的结果
import numpy as np
a=np.array([[1,2,3],[2,3,9]])
#计算这个矩阵的所有的元素之和:
b=np.sum(a)
#平均值就是b/6
#如果要算出每一列的平均值,可以按列求和,进而算出各自的平均值。
b=np.sum(a,axis=1)/2
#按行求平均值,可以写为:
b=np.sum(a,axis=0)/3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

numpy读取和存储数据

读取

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

fname:传入一个路径
dtype:数据类型(默认情况下对于较大的数据会将其变为科学计数的方式
delimiter:分隔符(对于CSV,肯定是写逗号,CSV中数据都是由逗号分隔开的。)
skiprows:跳过前几行(CSV中第一行一般都是列名,所以通过skiprows=0,来跳过第一行。)
usecols:读取指定的列。
unpack:转至(行变成列,列变成行)。转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。
在这里插入图片描述
在这里插入图片描述
例子:
在这里插入图片描述
结果:在这里插入图片描述

numpy索引和切片

取某一列(行)

注意:取某范围的行列数据都是前闭后开
对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢?
其实操作很简单,和python中列表的操作一样
例子:
在这里插入图片描述
取行:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
取列:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
取多行和多列
取第3行,第4列的值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
取第3行到第5行,第2列到第4列的结果:
取的是交叉点的位置数据

注意前闭后开
第3行index为2,由于前闭,所以取2
第5行index为4,由于后开,所以取5

注意方括号的取值时,[[0,2,2], [0,1,3]],对应的是(0,0) (2,1) (2,3) 三个点位置数据结果,是行数index为2,列数index为1,所对应的数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
取多个不相邻的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

numpy中数值的修改

在这里插入图片描述

numpy中布尔索引

修改行列的值,我们能够很容易的实现,但是如果条件更复杂呢?
比如我们想要把t中小于10的数字替换为3
即只有为True的位置才能被赋值。
在这里插入图片描述在这里插入图片描述

numpy中三元运算符

python中的三运运算符:
在这里插入图片描述
判断条件3>2,满足的情况下a = 3,否则a = 4

那么问题来了:
如果我们想把t中小于10的数字替换为0,把大于10的替换为10,应该怎么做??
在这里插入图片描述

numpy中的clip(裁剪)

那么问题来了:
如果我们想把t中小于10的数字替换为0,把大于20的替换为20,应该怎么做??
clip可以快速完成,不需要在写两次判断
小于10的都替换成10,大于18的都替换成18
包不包含10这个位置的数据,或包不包含18这个位置的数据都不影响。
在这里插入图片描述

numpy中的nan和inf

观察上边的操作:
小于10的替换为10,大于18的替换为了18,但是nan没有被替换,那么nan是什么?

nan(NAN,Nan): not a number表示不是一个数字

什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

inf(-inf,inf): infinity,inf表示正无穷,-inf表示负无穷

什么时候回出现inf包括(-inf,+inf):
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
在这里插入图片描述
在这里插入图片描述
inf于nan的类型均为float
在这里插入图片描述

numpy中的nan的注意点

1、两个nan是不相等的
在这里插入图片描述
2、np.nan! = np.nan
在这里插入图片描述
3、利用以上的特性,判断数组中nan的个数
在这里插入图片描述
np.count_nonzero(t2)表示统计t2中不为0的个数。
在这里插入图片描述
np.count_nonzero(t!=t)表示统计t中为nan的个数。因为两个nan是不相等的
在这里插入图片描述
4、由于2,那么如何判断一个数字是否为nan呢?通过np.isnan(a)来判断,返回bool类型,比如希望把nan替换为0。
在这里插入图片描述

在这里插入图片描述
5、nan和任何值计算都为nan。
在这里插入图片描述
在这里插入图片描述
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小。
所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

那么问题来了:
如何计算一组数据的中值或者是均值
如何删除有缺失数据的那一行(列)[在pandas中介绍]

numpy中常用统计函数

求和:t.sum(axis=None)
均值:t.mean(a,axis=None) 受离群点的影响较大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值只差
标准差:t.std(axis=None)
在这里插入图片描述
(N表示这堆数据的个数,μ为均值)
(标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定)

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

ndarry缺失值填充均值

t中存在nan值,如何操作把其中的nan填充为每一列的均值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结:

在这里插入图片描述
练习01:
英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习02:
希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数组的拼接

在这里插入图片描述

数组的行列交换

数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴

如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同

那么问题来了?
如何交换某个数组的行或者列呢?
在这里插入图片描述
练习:
现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办:
在这里插入图片描述
在这里插入图片描述

numpy更多好用的方法

1、获取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
在这里插入图片描述
2、创建一个全0的数组: np.zeros((3,4))
3、创建一个全1的数组:np.ones((3,4))
在这里插入图片描述
4、创建一个对角线为1的正方形数组(方阵):np.eye(3)
在这里插入图片描述

numpy生成随机数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:取不到20

.seed(s)随机种子的使用:
不适用随机种子,生成的随机数是不固定的。
在这里插入图片描述
其结果每次运行都会发生改变:
在这里插入图片描述
使用了随机种子:
在这里插入图片描述
随机的结果将被固定,之后再运行程序,随机结果都不会再发生变化:
在这里插入图片描述

numpy的注意点copy和view

1、a=b 完全不复制,a和b相互影响
2、a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
3、a = b.copy(),复制,a和b互不影响

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Henrik698

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值