四、Numpy详细教程

python编程快速上手(持续更新中…)


4.1 Numpy优势

1 Numpy介绍

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

2 ndarray介绍

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
在这里插入图片描述
用ndarray进行存储:

import numpy as np

# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])


score

提问:
使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpy的ndarray呢?

3 ndarray与Python原生list运算效率对比

在这里我们通过一段代码运行来体会到ndarray的好处

import random
import time
import numpy as np
a = []for i in range(100000000):
    a.append(random.random())
# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间
%time sum1=sum(a)

b=np.array(a)

%time sum2=np.sum(b)

其中第一个时间显示的是使用原生Python计算时间,第二个内容是使用numpy计算时间:

Wall time: 4.58 ms
Wall time: 1.03 ms

从中我们看到ndarray的计算速度要快很多,节约了时间。

机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。

思考:
ndarray为什么可以这么快?

4 ndarray的优势

4.1 内存块风格

ndarray到底跟原生python列表有什么不同呢,请看一张图:
在这里插入图片描述
ndarray中的所有元素的类型都是相同的
ndarray在存储数据的时候,数据与数据的地址都是连续的,而python原生list就只能通过寻址方式找到下一个元素

Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多

4.2 ndarray支持并行化运算(向量化运算)

numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算

4.3 效率远高于纯Python代码

Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。

4.2 N维数组-ndarray

1 ndarray的属性

在这里插入图片描述

2 ndarray的形状

import numpy as np 

a = np.array([[1,2,3],[4,5,6]])

b = np.array([1,2,3,4])

c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a.shape #(2, 3) 23元数
b.shape #(4,)  4元素
c.shape # (2, 2, 3) 223

3 ndarray的类型

dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型
在这里插入图片描述
在这里插入图片描述
创建数组的时候指定类型

a = np.array([[1, 2, 3],[4, 5, 6]], dtype=np.float32)
a.dtype # dtype(‘float32’)

arr = np.array([‘python’, ‘tensorflow’, ‘scikit-learn’, ‘numpy’], dtype = np.string_)
arr #dtype(‘string’)

注意:若不指定,整数默认int64,小数默认float64

4.3 基本操作

1 生成数组的方法

1.1 生成0和1的数组

np.ones(shape, dtype)
np.ones_like(a, dtype)
np.zeros(shape, dtype)
np.zeros_like(a, dtype)

1.2 从现有数组生成

1.2.1 生成方式
np.array(object, dtype)
np.asarray(a, dtype)
在这里插入图片描述

1.3 生成固定范围的数组

1.3.1 np.linspace (start, stop, num, endpoint)
创建等差数组 — 指定数量
参数:

  • start:序列的起始值
  • stop:序列的终止值
  • num:要生成的等间隔样例数量,默认为50
  • endpoint:序列中是否包含stop值,默认为ture

1.3.2 np.arange(start,stop, step, dtype)
创建等差数组 — 指定步长
参数

  • step:步长,默认值为1

1.3.3 np.logspace(start,stop, num)
创建等比数列

参数:

  • num:要生成的等比数列数量,默认为50
    在这里插入图片描述

1.4 生成随机数组

1.4.1 使用模块介绍

np.random模块

1.4.2 正态分布

一、基础概念复习:正态分布(理解)
a. 什么是正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )

在这里插入图片描述
b. 正态分布的应用
生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。
c. 正态分布特点
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

标准差如何来?
方差

是在概率论和统计方差衡量一组数据时离散程度的度量
在这里插入图片描述
标准差与方差的意义
可以理解成数据的一个离散程度的衡量

在这里插入图片描述
二、正态分布创建方式

np.random.randn(d0, d1, …, dn)

功能:从标准正态分布中返回一个或多个样本值

np.random.normal(loc=0.0, scale=1.0, size=None)

  • loc:float

此概率分布的均值(对应着整个分布的中心centre)

  • scale:float

​ 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

  • size:int or tuple of ints

​ 输出的shape,默认为None,只输出一个值

np.random.standard_normal(size=None)

返回指定形状的标准正态分布的数组。

举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个
在这里插入图片描述
在这里插入图片描述
例如:我们可以模拟生成一组股票的涨跌幅的数据

举例2:随机生成4支股票1周的交易日涨幅数据

4支股票,一周(5天)的涨跌幅数据,如何获取?
随机生成涨跌幅在某个正态分布内,比如均值0,方差1
在这里插入图片描述

1.4.3 均匀分布

np.random.rand(d0, d1, …, dn)
返回[0.0,1.0)内的一组均匀分布的数。

np.random.uniform(low=0.0, high=1.0, size=None)

功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.

参数介绍:

  • low: 采样下界,float类型,默认值为0;
  • high: 采样上界,float类型,默认值为1;
  • size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。
  • q 返回值:ndarray类型,其形状和参数size中描述一致。

np.random.randint(low, high=None, size=None, dtype=‘l’)

从一个均匀分布中随机采样,生成一个整数或N维整数数组,
取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
在这里插入图片描述
在这里插入图片描述

2 数组的索引、切片

2.1 一维、二维、三维的数组如何索引?

直接进行索引,切片
对象[:, :] – 先行后列

2.2 二维数组索引方式:

举例:获取第一个股票的前3个交易日的涨跌幅数据

3 形状修改

3.1 ndarray.reshape(shape, order)

返回一个具有相同数据域,但shape不一样的视图
行、列不进行互换

在这里插入图片描述

3.2 ndarray.resize(new_shape)

修改数组本身的形状(需要保持元素个数前后相同)
行、列不进行互换

3.3 ndarray.T

数组的转置
将数组的行、列进行互换
在这里插入图片描述
如果遇到

IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
--NotebookApp.iopub_data_rate_limit.

这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件
创建配置文件

jupyter notebook --generate-config
vi ~/.jupyter/jupyter_notebook_config.py

取消注释,多增加

##(bytes/sec) Maximum rate at which messages can be sent on iopub before they# are limited.
c.NotebookApp.iopub_data_rate_limit = 10000000

但是不建议这样去修改,jupyter输出太大会崩溃

5 数组的去重

5.1 np.unique()

在这里插入图片描述

4.4 ndarray运算

1 逻辑运算

在这里插入图片描述

2 通用判断函数(all,any)

在这里插入图片描述

3 np.where(三元运算符)

在这里插入图片描述

4 统计运算

如果想要知道学生成绩最大的分数,或者做小分数应该怎么做?

4.1 统计指标

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:

min(a, axis)
max(a, axis])
median(a, axis)
mean(a, axis, dtype)
std(a, axis, dtype)
Compute the standard deviation along the specified axis.
var(a, axis, dtype)
Compute the variance along the specified axis.

4.2 案例:学生成绩统计运算

进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

如果需要统计出某科最高分对应的是哪个同学?

np.argmax(temp, axis=)

在这里插入图片描述

4.5 数学:矩阵

在这里插入图片描述

4.6 矩阵案例

在这里插入图片描述广播机制
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制

思考:下面两个ndarray是否能够进行运算?
在这里插入图片描述

4.7矩阵乘法api

在这里插入图片描述
np.matmul和np.dot的区别:
二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值