Numpy详解

视频教程

1.什么是numpy

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

为什么学习numpy?

1.快速

2.方便

3.科学计算的基础库

2.numpy基础

2.1numpy创建数组(矩阵)

在这里插入图片描述

2.2numpy中常见的更多数据类型

在这里插入图片描述

2.3数据类型的操作

在这里插入图片描述

代码示例

# coding=utf-8
import numpy as np
import random

#使用numpy生成数组,得到ndarray的类型
t1 = np.array([1,2,3,])
print(t1)
print(type(t1))

t2 = np.array(range(10))
print(t2)
print(type(t2))

t3 = np.arange(4,10,2)
print(t3)
print(type(t3))

print(t3.dtype)
print("*"*100)
#numpy中的数据类型

t4 = np.array(range(1,4),dtype="i1")
print(t4)
print(t4.dtype)

##numpy中的bool类型
t5 = np.array([1,1,0,1,0,0],dtype=bool)
print(t5)
print(t5.dtype)

#调整数据类型
t6 = t5.astype("int8")
print(t6)
print(t6.dtype)

#numpy中的小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)

t8 = np.round(t7,2)
print(t8)

2.4数组的形状

在这里插入图片描述
在这里插入图片描述

2.5数组和数的计算

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.7广播原则

在这里插入图片描述

怎么理解呢?

可以把维度指的是shape所对应的数字个数

那么问题来了:

shape为(3,3,3)的数组能够和(3,2)的数组进行计算么? 不能

shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?

有什么好处呢?

举个例子:每列的数据减去列的平均值的结果

2.8轴(axis)

在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值

那么问题来了:

在前面的知识,轴在哪里?

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

二维数组的轴

在这里插入图片描述

三维数组的轴

在这里插入图片描述

2.9numpy读取数据

CSV:Comma-Separated Value,逗号分隔值文件

显示:表格状态

源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的

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

在这里插入图片描述

在这里插入图片描述

2.10numpy中的转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

在这里插入图片描述

以上的三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

2.11numpy索引和切片

对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢?

其实操作很简单,和python中列表的操作一样

在这里插入图片描述

代码示例

# coding=utf-8
import numpy as np

us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"

# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int")

# print(t1)
print(t2)

print("*"*100)

#取行
# print(t2[2])

#取连续的多行
# print(t2[2:])

#取不连续的多行
# print(t2[[2,8,10]])

# print(t2[1,:])
# print(t2[2:,:])
# print(t2[[2,10,3],:])

#取列
# print(t2[:,0])

#取连续的多列
# print(t2[:,2:])

#取不连续的多列
# print(t2[:,[0,2]])

#去行和列,取第3行,第四列的值
# a = t2[2,3]
# print(a)
# print(type(a))

#取多行和多列,取第3行到第五行,第2列到第4列的结果
#去的是行和列交叉点的位置
b = t2[2:5,1:4]
# print(b)

#取多个不相邻的点
#选出来的结果是(0,0) (2,1) (2,3)
c = t2[[0,2,2],[0,1,3]]
print(c)

2.12numpy中数值的修改

在这里插入图片描述

2.13numpy中布尔索引

在这里插入图片描述

2.14numpy中三元运算符

在这里插入图片描述

2.15numpy中的clip(裁剪)

在这里插入图片描述

观察上方的操作:

小于10的替换为10,大于18的替换为了18,nan不会被替换

2.16numpy中的nan和inf

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)

在这里插入图片描述

numpy中的nan的注意点

在这里插入图片描述

那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

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

2.17numpy中常用统计函数

求和: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)

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

2.18 一个小案例

t中存在nan值,如何操作把其中的nan填充为每一列的均值

t = array([[ 0., 1., 2., 3., 4., 5.],

​ [ 6., 7., nan, 9., 10., 11.],

​ [ 12., 13., 14., nan, 16., 17.],

​ [ 18., 19., 20., 21., 22., 23.]])

import numpy as np
def Fill_Ndarry(r1):
    for i in range(r1.shape[1]):
        temp_col = r1[:, i]
        nan_num = np.count_nonzero(temp_col != temp_col)
        if nan_num != 0:
            temp_not_nan = temp_col[temp_col == temp_col]
            # print(temp_not_nan)
            temp_col[np.isnan(temp_col)] = temp_not_nan.mean()
            # print(temp_col[np.isnan(temp_col)])
    return r1
if __name__ == '__main__':
    t1 = np.arange(24).reshape((4, 6)).astype("float")
    t1[1, 2:] = np.nan
    print(t1)
    t1 = Fill_Ndarry(t1)
    print(t1)

2.19数组的拼接及行列交换

在这里插入图片描述

数组的行列交换

在这里插入图片描述

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)

一个小案例

拼接两个国家的数据
import numpy as np

us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
# 加载国家数据
us_data = np.loadtxt(us_file_path, delimiter=',', dtype='int')
uk_data = np.loadtxt(uk_file_path, delimiter=',', dtype='int')
# 添加国家信息  美国第1列前加0,英国第1列前加1
# shape[0]为数据的行数,zeros和ones能制造全为0和1的数组,但类型为float,需要转换为int
zeros_data = np.zeros((us_data.shape[0], 1)).astype(int)  # 制造有同us_data同行数只有1列的数组,且数据都为0
ones_data = np.ones((uk_data.shape[0], 1)).astype(int)  # 制造有同uk_data同行数只有1列的数组,且数据都为0
# 垂直拼接数据
us_data = np.hstack((us_data, zeros_data))
uk_data = np.hstack((uk_data, ones_data))
# 拼接两组数据
final_data = np.vstack((uk_data, us_data))
print(final_data)

2.20numpy生成随机数

在这里插入图片描述

分布的补充

在这里插入图片描述

2.21numpy的注意点copy和view

1.a=b 完全不复制,a和b相互影响

2.a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,

3.a = b.copy(),复制,a和b互不影响

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BillySturate

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

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

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

打赏作者

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

抵扣说明:

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

余额充值