type
status
date
slug
summary
tags
category
icon
password
学习目标
- 了解Numpy运算速度上的优势
- 知道数组的属性,形状、类型
- 应用Numpy实现数组的基本操作
- 应用随机数组的创建实现正态分布应用
- 应用Numpy实现数组的逻辑运算
- 应用Numpy实现数组的统计运算
- 应用Numpy实现数组之间的运算
1 概述
Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
2 ndarray简介
NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type.
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合

用ndarray进行存储:
返回结果:
使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpy的ndarray呢?
2.1 效率对比
ndarray与Python原生list运算的效率对比在这里我们通过一段代码运行来体会到ndarray的好处
其中第一个时间显示的是使用原生Python计算时间,第二个内容是使用numpy计算时间:
从中我们看到ndarray的计算速度要快很多,节约了时间。
机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。
思考:ndarray为什么可以这么快?
2.2 优势
2.2.1 内存块风格
ndarray到底跟原生python列表有什么不同呢,请看一张图:

从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
2.2.2 并行化运算(向量化运算)
2.2.3 效率高
Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。
2.3 属性
数组属性反映了数组本身固有的信息。
属性名字 | 属性解释 |
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
2.3.1 ndarray的形状
首先创建一些数组。
分别打印出形状
如何理解数组的形状?
二维数组:

三维数组:

2.3.2 ndarray的类型
dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型
名称 | 描述 | 简写 |
np.bool | 用一个字节存储的布尔类型( True或False) | 'b' |
np.int8 | 一个字节大小, 至 | 'i' |
np.int16 | 整数, 至 | 'i2' |
np.int32 | 整数, 至 | 'i4' |
np.int64 | 整数, 至 | 'i8' |
np.uint8 | 无符号整数, 至 | 'u' |
np.uint16 | 无符号整数, 至 | 'u2' |
np.uint32 | 无符号整数, 至 | 'u4' |
np.uint64 | 无符号整数, 至 | 'u8' |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | 'f2' |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | 'f4' |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | 'f8' |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | 'c8' |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | 'c16' |
np.object_ | python对象 | 'O' |
np.string_ | 字符串 | 'S' |
np.unicode_ | unicode类型 | 'U' |
创建数组的时候指定类型
- 注意:若不指定,整数默认int64,小数默认float64
3 基本操作
3.1 生成数组
3.1.1 生成0和1的数组
3.1.2 从现有数组生成
- 生成方式:
np.array(object[, dtype, copy, order, subok, ndmin])np.asarray(a[, dtype, order])
- 关于array和asarray的不同

3.1.3 生成固定范围的数组
生成等间隔的序列
参数 | 含义 |
start | 序列的起始值 |
stop | 序列的终止值 |
num | 要生成的等间隔样例数量,默认为50 |
endpoint | 序列中是否包含stop值,默认为ture |
返回结果:
- 其它的还有
- numpy.arange(start,stop, step, dtype)
- numpy.logspace(start,stop, num)
返回结果:
返回结果:
3.1.4 生成随机数组
使用随机数据需要用到
np.random模块均匀分布
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类型,缺省时输出1个值 |
返回值:ndarray类型,其形状和参数size中描述一致。
np.random.randint(low,high=None,size=None,dtype='l')
从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
返回结果:
画图看分布状况:

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

生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
标准差如何来?
是在概率论和统计方差衡量一组数据时离散程度的度量
其中M为平均值,n为数据总个数,S为标准差,可以理解一个整体为方差
可以理解成数据的一个离散程度的衡量

- 正态分布创建方式
np.random.randn(d0, d1, …, dn)np.random.normal(loc=0.0,scale=1.0,size=None)np.random.standard_normal(size=None)- 两周的交易日数量为:2 X 5 =10
- 随机生成涨跌幅在某个正态分布内,比如均值0,方差1
功能:从标准正态分布中返回一个或多个样本值
参数 | 含义 |
loc | float,此概率分布的均值(对应着整个分布的中心centre) |
scale | float,此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高) |
size | int or tuple of ints,输出的shape,默认为None,只输出一个值 |
返回指定形状的标准正态分布的数组。
返回结果:

例如:我们可以模拟生成一组股票的涨跌幅的数据
案例:随机生成8只股票2周的交易日涨幅数据
8只股票,两周(10天)的涨跌幅数据,如何获取?
股票涨跌幅数据的创建
返回结果:
3.2 数组的索引、切片
- 获取第一个股票的前3个交易日的涨跌幅数据
返回结果:
一维、二维、三维的数组如何索引?
3.3 形状修改
让刚才的股票行、日期列反过来,变成日期行,股票列
ndarray.reshape(shape[, order])
Returns an array containing the same data with a new shape.
ndarray.resize(new_shape[, refcheck])
Change shape and size of array in-place.
ndarray.T
数组的转置
- 将数组的行、列进行互换
3.4 类型修改
ndarray.astype(type)
ndarray.tostring([order])或者ndarray.tobytes([order])
Construct Python bytes containing the raw data bytes in the array.
- 转换成bytes
拓展:如果遇到
这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件
创建配置文件
取消注释,多增加
但是不建议这样去修改,jupyter输出太大会崩溃
3.5 数组的去重
np.unique()
4 ndarray运算
如果想要操作符合某一条件的数据,应该怎么做?
4.1 逻辑运算
4.2 通用判断函数
np.all()
np.any()
4.3 np.where(三元运算符)
通过使用np.where能够进行更加复杂的运算
np.where()
- 复合逻辑需要结合
np.logical_and和np.logical_or使用
4.4 统计运算
如果想要知道涨幅或者跌幅最大的数据,应该怎么做?
4.4.1 统计指标
在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:
min(a[, axis, out, keepdims])- Return the minimum of an array or minimum along an axis.
max(a[, axis, out, keepdims])- Return the maximum of an array or maximum along an axis.
median(a[, axis, out, overwrite_input, keepdims])- Compute the median along the specified axis.
mean(a[, axis, dtype, out, keepdims])- Compute the arithmetic mean along the specified axis.
std(a[, axis, dtype, out, ddof, keepdims])- Compute the standard deviation along the specified axis.
var(a[, axis, dtype, out, ddof, keepdims])- Compute the variance along the specified axis.
4.4.2 案例:股票涨跌幅统计运算
进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计
如果需要统计出哪一只股票在某个交易日的涨幅最大或者最小?
np.argmax(temp, axis=)
np.argmin(temp, axis=)
5 矩阵
5.1 矩阵和向量
5.1.1 矩阵
矩阵,英文matrix,和array的区别矩阵必须是2维的,但是array可以是多维的。
如图:这个是 矩阵,即 3 行 2 列,如 为行, 为列,那么 即
矩阵的维数:行数×列数
矩阵元素(矩阵项):
指第 行,第 列的元素。
5.1.2 向量
向量是一种特殊的矩阵,讲义中的向量一般都是列向量,下面展示的就是三维列 向量(3×1)
5.2 加法和标量乘法
矩阵的加法:行列数相等的可以加。
如图:
矩阵的乘法:每个元素都要乘。
如图:
组合算法也类似。
5.3 矩阵向量乘法
矩阵和向量的乘法如图: 的矩阵乘以 的向量,得到的是 的向量
如图:
5.4 矩阵乘法
矩阵乘法:
矩阵乘以 矩阵,变成 矩阵。
举例:比如说现在有两个矩阵 和 ,那 么它们的乘积就可以表示为图中所示的形式。
5.5 矩阵乘法的性质
不满足交换律:
结合律:
单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的,我们称这种矩阵为单位矩阵.
它是个方阵,一般用 或者 表示,从 左上角到右下角的对角线(称为主对角线)上的元素均为 1 以外全都为 0。如:
5.6 逆、转置
矩阵的逆:如矩阵 A 是一个
矩阵(方阵),如果有逆矩阵,则:低阶矩阵求逆的方法:
1.待定系数法
2.初等变换
矩阵的转置:设 为 阶矩阵,第 行 列的元素是 ,即:
定义 的转置为这样一个 阶矩阵 ,满足 ,即 ,记 。
直观来看,将 的所有元素绕着一条从第 行第 列元素出发的右下方 度的射线作 镜面反转,即得到 的转置。
6 数组运算
6.1 场景

数据:
6.2 数组与数的运算
6.3 数组与数组的运算
上面这个能进行运算吗,结果是不行的!
6.4 广播机制
执行 broadcast 的前提在于,两个
ndarray 执行的是 element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。
- 维度相等
- shape(其中相对应的一个地方为1)
例如:
如果是下面这样,则不匹配:
思考:下面两个ndarray是否能够进行运算?
6.5 矩阵运算
6.5.1 矩阵乘法api:
np.matmul
np.dot
np.matmul和np.dot的区别:二者都是矩阵乘法。
np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。6.5.2 矩阵应用场景
大部分机器学习算法需要用到
- 作者:KaiGuo
- 链接:https://blog.kaiguov5.com/article/b3553bd0-6929-4de1-9dbc-0be675fa1753
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
