#python 3.8.5
#numpy-1.19.1
Numpy库官网:https://numpy.org/,可以查到关于该库的很多东西。
如果要学习Numpy基础知识,建议学习MOOC的高嵩老师的《Python数据分析与展示课程》
1.一些基本概念
1.1.数据的维度:
1.1.1一维数据:
一维数据由一组关系对等的有序或无序数据构成,采用线性方式组织,对应编程语言中的 列表(list),数组(python没有自带数组),集合(set)等
列表、数组:一组数据的有序结构(即可以通过下标找到相应的数据),元素可以重复。集合是无序的,元素不能重复。
列表和数组的区别:
列表的每个元素类型可以不一样
列表:list[123,'a',3.14,[1,2,3]],元素包括整型,字符串,浮点型,列表类型
数组:array[123,2,4,5] 元素只有整型
1.1.2 二维数据:
二维数据由多个一维数据构成,是一维数据的组合形式。
表格是二维数据的一种典型,其中表头也是二维数据的一部分
1.1.3 多维数据:
多维数据由一维和二维数据,在新维度上的扩展形成。
1.1.4高维数据
高维数据仅利用基本的二元关系展示数据间复杂的关系,比如
{‘first name’:'Tom',
'last name' : 'Jerry',
'address':{
'street' :'xxxx',
'zip':'123456'
'city':'Beijing'
},
'prof':['aaaa','bbbbbb']
}
1.1.5 数据维度的python表示
一维数据:列表,集合
二维数据:列表(多维列表)
高维数据:字典或数据表示格式(JSON,XML)
2.Numpy库介绍
Numpy是一个开源的科学计算基础库
一个强大的多维对象ndarray(底层是C语言,这样数组间的计算就非常快,要求数组维度相同)
广播功能函数
整合C/C++/Fortran 代码工具
线性代数,傅里叶变换,随机数生成等功能
Numpy是Pandas,Scipy等数据处理的或科学计算库的基础
2.1 Numpy引用
#先安装numpy,在操作系统控制台(win+R, 输入cmd)
pip install numpy
#引用
import numpy as np #一般约定用np作为别名
2.2. ndarray (别名array)
ndarray是一个多维数组对象,由两部分构成:
• 实际的数据
• 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始
array=np.array([0,1,2,3,4],[5,6,7,8,9]) #生成一个ndarray数组对象,用了ndarray别名array
print(array)
输出结果:[0 1 2 3 4] [5 6 7 8 9] np.array()输出成[]形式,元素由空格分割
轴(axis): 保存数据的维度;秩(rank):轴的数量
ndarray基本属性
import numpy as np
array=np.array([0,1,2,3,4],[5,6,7,8,9])
| 属性 | 参数 | 类型 | 具体值 | 实例 | 返回值 |
| .ndim | 秩,即轴的数量或维度的数量 | int | 表示轴的数量 | array.ndim | 2 |
| .shape | ndarray对象的尺度,对于矩阵,n行m列 | 元组类型 | (3,2)表示3行2列 | array.shape | (2,5) |
| .size | ndarray对象元素的个数,相当于.shape中n*m的值 | int | 6,表示有6个元素 | array.size | 10 |
| .dtype | ndarray对象的元素类型 | string | int32,表示int32类型 | array.dtype | int32 |
| .itemsize | ndarray对象中每个元素的大小,以字节为单位 | string | 表示元素大小(字节单位) | array.itemsize | 4 |
| .data |
原始文档是这么说的: the buffer containing the actual elements of the array. Normally, we won’t need to use this attribute because wewill access the elements in an array using indexing facilities. |
数据类型说明(1)
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数,取值:[‐128, 127]
int16 16位长度的整数,取值:[‐32768, 32767]
int32 32位长度的整数,取值:[‐231, 231‐1]
int64 64位长度的整数,取值:[‐263, 263‐1]
ndarray的元素类型(2)
uint8 8位无符号整数,取值:[0, 255]
uint16 16位无符号整数,取值:[0, 65535]
uint32 32位无符号整数,取值:[0, 232‐1]
uint64 32位无符号整数,取值:[0, 264‐1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数
ndarray的元素类型(3)
complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数
ndarray为什么要支持这么多种元素类型?
对比:Python语法仅支持整数、浮点数和复数3种类型
• 科学计算涉及数据较多,对存储和性能都有较高要求
• 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
• 对元素类型精细定义,有助于程序员对程序规模有合理评估
ndarray数组可以由非同质对象构成
a=np.array([[1,2,3,4,5],[1,2,3]])
非同质ndarray元素为对象类型为object
非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用
3 ndarray数组的创建方法
• 从Python中的列表、元组等类型创建ndarray数组
• 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
• 从字节流(raw bytes)中创建ndarray数组
• 从文件中读取特定格式,创建ndarray数组
3.1 从Python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
x = np.array([1,2,3]) #列表创建
x = np.array((1,2,3)) #元组创建
x = np.array([[1,2,3],(4,5,6)]) #列表,元组混合创建,但是列表元素和元组元素个数需要相同
3.2 使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
| 函数 |
说明 | 实例 | 结果 |
| np.arange(n) | 类似range()函数,返回ndarray类型,元素从0到n‐1 | np.arange(3) | [1 2 3] |
| np.ones(shape) | 根据shape生成一个全1数组,shape是元组类型 | np.ones((2,2)) |
[[1 1] [1 1]] |
| np.zeros(shape) | 根据shape生成一个全0数组,shape是元组类型 | np.zeros((2,2)) |
[[0 0] [0 0]] |
| np.full(shape,val) | 根据shape生成一个数组,每个元素值都是val | np.full((3,2),2) |
[[2 2] [2 2] [2 2]] |
| np.eye(n) | 创建一个正方的n*n单位矩阵,对角线为1,其余为0 | np.eye(3) |
[[1 0 0] [0 1 0] [0 0 1]] |
| np.empty() | 创建一组随机数,float64类型 | np.empty((m,n)) | |
| np.ones_like(a) | 根据数组a的形状生成一个全1数组 | ||
| np.zeros_like(a) | 根据数组a的形状生成一个全0数组 | ||
| np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val | ||
| np.linspace() |
1.根据起止数据等间距地填充数据,形成数组 (元素默认是浮点型) np.linspace(start,end,count) start=起始值 end=结束值 count=数组个数 |
np.linspace(1,10,4) | [1. 4. 7. 10.] |
|
2. np.linspace(start,end,count,endpoint=False) endpoint=False 表示结束值不在数组内 |
np.linspace(1,10,4,endpoint=False) | [1. 3.25 5.5 7.75] | |
| np.concatenate() | 将两个或多个数组合并成一个新的数组 |
a=np.array([1,2,3]) b=np.array([4,5,6]) c=np.concatenate(a,b) |
[1 2 3 4 5 6] |
4 ndarray数组的变换
| 函数 |
说明 | 实例 | 结果 |
| .reshape(shape) |
.reshape(shape) 不改变数组元素 返回一个shape形状的数组 原数组不变 |
a=np.array([[1,2,3],[4,5,6]]) b=a.reshape((3,2)) |
b= [[1 2] [3 4] [5 6]] |
| .resize(shape) | 与.reshape()功能一致,但修改原数组 |
a=np.array([[1,2,3],[4,5,6]]) a.resize((3,2)) |
a= [[1 2] [3 4] [5 6]] |
| .swapaxes(ax1,ax2) |
将数组n个维度中两个维度进行调换 原数组不变 |
f=np.ones((3,2)) 将第0轴,与第1轴互换 轴标从0开始
|
h= [[1. 1.] |
| .flatten() |
对数组进行降维,返回折叠后的一维数组 原数组不变 |
d=np.ones((3,5)) e=d.flatten() |
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] |
5 ndarray数组的类型变换
new_a = a.astype(new_type)
实例:
a=np.ones((2,2))
b=a.astype(np.float)
b=[[1. 1.] [1. 1.]]
6 ndarray数组向列表的转换
ls = a.tolist()
实例:
a=np.full((2,2),25,dtype=np.int32)
b=a.tolist()
b:[[25,25],[25,25]]
7 ndarray数组的索引和切片
索引:获取数组中特定位置元素的过程(一维数组的索引和切片:与Python的列表类似)
切片:获取数组元素子集的过程
a=np.array([1,2,3,4,5,6,7,8,9])
#索引
a[2]=3
#切片
b=a[1:4:2] #[起始编号: 终止编号(不含): 步长,3元素冒号分割]
b:[2 4]
多维数组的索引:


多维数组的切片:


8 ndarray数组的运算
数组与标量之间的运算作用于数组的每一个元素
![]()
![]()
一元函数
| 函数 | 说明 |
|
|
| np.abs(x) np.fabs(x) | 计算数组各元素的绝对值 | ||
| np.sqrt(x) | 计算数组各元素的平方根 | ||
| np.square(x) | 计算数组各元素的平方 | ||
| np.log(x) np.log10(x) np.log2(x) |
计算数组各元素的自然对数、10底对数和2底对数 | ||
| np.ceil(x) np.floor(x) | 计算数组各元素的ceiling值或floor值 | ||
| np.rint(x) | 计算数组各元素的四舍五入值 | ||
| np.modf(x) | 将数组各元素的小数和整数部分以两个独立数组形式返回 | ||
| np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) |
计算数组各元素的普通型和双曲型三角函数 | ||
| np.exp(x) | 计算数组各元素的指数值 | ||
| np.sign(x) | 计算数组各元素的符号值,1(+), 0, ‐1(‐) | ||
二元函数
| 函数 | 说明 | ||
| + ‐ * / ** | 两个数组各元素进行对应运算 | ||
| np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() |
元素级的最大值/最小值计算 | ||
| np.mod(x,y) | 元素级的模运算 | ||
| np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 | ||
| > < >= <= == != | 算术比较,产生布尔型数组 |
实例


数组间运算
|
A=np.array( [[1,1],[0,1]] ) B=np.array( [[2,0],[3,4]] ) |
|||
|
A*B |
array([[2, 0],[0, 4]]) | ||
|
A@B |
array([[5, 4],[3, 4]]) | ||
|
A.dot(B) |
array([[5, 4],[3, 4]]) | ||
|
A+B |
array([[3,2],[3, 5]]) | ||
|
注意: 手册中有这么一句话:如果两个数组的元素类型不一样 结果的数组精度比运算数组精度要高就没问题 如果结果的数组精度比运算数组精度低,就会报错 When operating with arrays of different types the type of the resulting array corresponds to the more general or preciseone (a behavior known as upcasting). |
9. CSV 文件存取
存放
1 np.savetxt(frame, array, fmt='%.18e', delimiter=None)
• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• array : 存入文件的数组
• fmt : 写入文件的格式,例如:%d %.2f %.18e
• delimiter : 分割字符串,默认是任何空格
读取
1 np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
• frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
• dtype : 数据类型,可选
• delimiter : 分割字符串,默认是任何空格
• unpack : 如果True,读入属性将分别写入不同变量
CSV只能有效存储一维和二维数组
多维数据的存取
1 a.tofile(frame, sep='', format='%s')
• frame : 文件、字符串
• sep : 数据分割字符串,如果是空串,写入文件为二进制
• format : 写入数据的格式
np.savetxt() np.loadtxt()只能有效存取一维和二维数组
sssssssssssssssssss
• frame : 文件、字符串
• dtype : 读取的数据类型
• count : 读入元素个数,‐1表示读入整个文件
• sep : 数据分割字符串,如果是空串,写入文件为二进制
1 np.save(fname, array) 或np.savez(fname, array)
• fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
• array : 数组变量
np.load(fname)
• fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
10.NumPy的random子库
| 函数 | 说明 | 实例 | |
| rand(d0,d1,..,dn) | 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 | a=np.random.rand(2,3) | |
| randn(d0,d1,..,dn) | 根据d0‐dn创建随机数数组,标准正态分布 | ||
| randint(low[,high,shape]) |
根据shape创建随机整数或整数数组,范围是[low, high) randint(low) 产生一个不超过Low的随机整数 randint(low,high),产生一个随机整数范围是[low, high) |
c=np.random.randint(2,10,(2,2)) | 数据为整型 |
| seed(s) | 随机数种子,s是给定的种子值 |
c=np.random.seed(n) 种子相同,随机数产生页会相同 |
| 函数 | 说明 | 实例 | |
| shuffle(a) | 根据数组a的第1轴进行随排列,改变数组x | np.random.shuffle(a) | a会变更 |
| permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变数组x | b=np.random.permutation(a) | a不会变更 |
| choice(a[,size,replace,p]) | 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False |
| 函数 | 说明 | 实例 | |
| uniform(low,high,size) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 | np.random.uniform(low,high,size) | 数据为浮点型 |
| normal(loc,scale,size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 | 数据为浮点型 | |
| poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 |
11. NumPy直接提供的统计类函数
| 函数 | 说明 | 实例 | |
| sum(a, axis=None) | 根据给定轴axis计算数组a相关元素之和,axis整数或元组 | ||
| mean(a, axis=None) | 根据给定轴axis计算数组a相关元素的期望,axis整数或元组 | ||
| average(a,axis=None,weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值 | ||
| std(a, axis=None) | 根据给定轴axis计算数组a相关元素的标准差 | ||
| var(a, axis=None) | 根据给定轴axis计算数组a相关元素的方差 | ||
| min(a) max(a) | 计算数组a中元素的最小值、最大值 | ||
| argmin(a) argmax(a) | 计算数组a中元素最小值、最大值的降一维后下标 | ||
| unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 | ||
| ptp(a) | 计算数组a中元素最大值与最小值的差 | ||
| median(a) | 计算数组a中元素的中位数(中值) | ||
12.梯度函数
| 函数 | 说明 | ||
| np.gradient(f) | 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 |
梯度:连续值之间的变化率,即斜率 其中,b的梯度是: (c‐a)/2 |
|
|
b=np.random.randn(0,20,(5)) [15,3,12,13,14] np.gradient(b) [-12,-1.5,5.,1.,1.] |
存在两侧值:(右侧-左侧)/2:(12‐15)/2 只有一侧值:(右边的-左边的)/1 :(14‐13)/1 |


浙公网安备 33010602011771号