如何系统地学习Numpy?初学者必知的Numpy基础知识

Posted 黑马程序员官方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何系统地学习Numpy?初学者必知的Numpy基础知识相关的知识,希望对你有一定的参考价值。

一、Numpy介绍

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

二、ndarray介绍

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。

用ndarray进行存储:

返回结果:

提问:

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

三、ndarrayPython原生list运算效率对比

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

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

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

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

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优

势就越明显。

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

四、ndarray的优势

4.1 内存块风格

ndarray到底跟原生python列表有什么不同呢,请看一张图:

从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python 原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy 的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

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

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

4.3 效率远高于纯Python代码

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

五、N维数组-ndarray

1 ndarray的属性

数组属性反映了数组本身固有的信息。

2 ndarray的形状

首先创建一些数组。

分别打印出形状

如何理解数组的形状?

二维数组:

三维数组:

3 ndarray的类型

dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型

创建数组的时候指定类型

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

总结

数组的基本属性【知道】

六、基本操作

生成数组的方法

1.1 生成01的数组

  • 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.2.2 关于arrayasarray的不同

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时的正态分布是标准正态分布。

标准差如何来?

  • 方差

是在概率论和统计方差衡量一组数据时离散程度的度量

其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差

  • 标准差与方差的意义

可以理解成数据的一个离散程度的衡量

二、正态分布创建方式

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

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

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

oc: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.2 均匀分布

  • np.random.rand(d0d1...dn)

返回[0.01.0)内的一组均匀分布的数。

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

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

参数介绍:

  • low: 采样下界,float类型,默认值为0;
  • high: 采样上界,float类型,默认值为1;
  • size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。

返回值:ndarray类型,其形状和参数size中描述一致。

  • np.random.randint(lowhigh=Nonesize=Nonedtype='l')

从一个均匀分布中随机采样,生成一个整数或N维整数数组,

取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数

返回结果:

画图看分布状况:

返回结果:

  • 三维数组索引方式:

形状修改

3.1 ndarray.reshape(shape, order)

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

3.2 ndarray.resize(new_shape)

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

3.3 ndarray.T

  • 数组的转置
  • 将数组的行、列进行互换

类型修改

4.1 ndarray.astype(type)

  • 返回修改了类型之后的数组

4.2 ndarray.tostring([order])或者ndarray.tobytes([order])

  • 构造包含数组中原始数据字节的Python字节

4.3 jupyter输出太大可能导致崩溃问题【了解】

如果遇到

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

创建配置文件

取消注释,多增加

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

数组的去重

5.1 np.unique()

以上是关于如何系统地学习Numpy?初学者必知的Numpy基础知识的主要内容,如果未能解决你的问题,请参考以下文章

成为单片机高手必知的三个步骤

web前端入门必知的10个技术

开发人员必知的 10 个 Linux 命令!

linux后台开发必知的io优化知识总结

Android基础——初学者必知的AIDL在应用层上的Binder机制

如何系统地学习Python 中 matplotlib,numpy,scipy,pandas