文章目录
Numpy入门
数据维度:
一组数据的组织形式
一维数据
-
对等关系
-
有序或无序
-
线性的方式组织
对应列表、数组、集合等概念(在Python基础数据类型中没有数组类型,在Numpy库中,定义了数组ndarray类)
列表与数组的异同:
同:都表示为一维数组的有序结构
异:列表中可以有不同数据类型的数据
数组中的数据类型必须相同(ndarray类中定义的数组可以存取不同数据类型的数据,但一般情况下数据类型相同)
二维数据
- 由多个一维数据构成
- 一维数据的组合形式
表格为典型的二维数据结构
二维数据可用列表表示
多维数据
- 由一维或二维数据在新维度上扩展形成
比如,在一张数据表上增加时间维度
同样可用列表的套嵌表示
高维数据:
- 仅利用最基本的二元关系(字典)展示数据间的复杂结构
- 可用键值树表示
Numpy的数组对象:ndarray
ndarray的优势:
- 数组对象可以去掉元素间运算所需要的循环,使一维向量更像单个数据
- 设置专门的数组对象,经过优化可以提升这类应用的运算速度(底层由C语言实现)
- 数组对象采用相同的数据类型,有助于节省运算和存储空间
ndarray是一个多维数组对象,由两部分构成:
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始(这与列表类型相同)
一般通过
import numpy as np
引入Numpy库,并简称为np
可通过np.array()生成ndarray数组
print(np.array([1,2,3,4,5]))
[1 2 3 4 5]
np.array()输出成 [ ] 形式,元素有空格分隔
在ndarray数组中有两个概念:
- 轴(axis):保存数据的维度
- 秩(rank):轴的数量
ndarray属性:
属性 | 描述 |
---|---|
ndim | 秩,及轴的数量或维度数量 |
shape | 对象的尺度,对于矩阵即n行m列,返回元组 |
size | 对象元素的个数,相当于n*m |
dtype | 对象的元素类型 |
itemsize | 对象中每个元素的大小,以字节表示 |
In [21]: a= np.array([[1,2,3,4,5],[6,7,8,9,10]])
In [22]: a.ndim
Out[22]: 2
In [23]: a.shape
Out[23]: (2, 5)
In [24]: a.size
Out[24]: 10
In [25]: a.dtype
Out[25]: dtype('int32')
In [26]: a.itemsize
Out[26]: 4
注:Numpy中存在有其自己定义的数据类型,大致与Python中的数据类型相同
ndarray数组的创建和变换
ndarray数组的创建方法:
-
从Python中列表、元组等类型创建ndarray数组
np.array( list/tuple , dtype = np.float32 )
In [27]:a = np.array([[0,1,2,3,4,],[5,6,7,8,9]],dtype=np.float32) In [28]:a Out[28]: array([[0., 1., 2., 3., 4.], [5., 6., 7., 8., 9.]], dtype=float32)
-
使用Numpy中的函数创建ndarray数组
方法 描述 np.arange(n) 类似range()函数,返回ndarray数组,[0,n) np.ones(shape) 根据shape生成一个全1数组,shape为元组 np.zeros(shape) 根据shape生成一个全0数组,shape为元组 np.full(shape,val) 根据shape生成一个全为val的数组,shape为元组 np.eye(n) 创建一个正方向n*n的单位矩阵 np.ones_like(a) 根据数组a生成一个全1数组,shape为元组 np.zeros_like(a) 根据数组a生成一个全0数组,shape为元组 np.full_like(a,val) 根据数组a生成一个全为val的数组,shape为元组 np.linspace() 根据起止数据,等间距填充数据 np.concatenate() 将两个或多个数组合并成一个新数组 -
从字节流(raw bytes)中创建ndarray数组
-
从文件中读取特定格式,创建ndarray
ndarray数组的变换:
对于创建后的ndarray数组,可对其进行维度变换和元素类型变换
方法 | 描述 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与np.reshape()功能一致,但修改原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中的两个维度进行调换 |
.flatten() | 对数据进行降维,返回折叠后的一维数组 |
.astype(new_type) | 改变数据类型 |
.tolist() | 转换为列表 |
对数组的操作
一维数组的索引与切片:
- 索引:
与Python列表类似
//使用np.arange()创建数组
In [9]:a = np.arange(0,23,2)
In [10]:a
Out[10]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22])
//对数组a进行索引,从0开始
In [11]:a[0]
Out[11]: 0
//同样存在负数的索引
In [12]:a[-1]
Out[12]: 22
-
切片:
同样与Python列表类似
In [13]:a[0:10:2]
Out[13]: array([ 0, 4, 8, 12, 16])
In [14]:a[::-1]
Out[14]: array([22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0])
多维数组的索引与切片:
-
索引
根据维度从里到外索引
每个维度用“,”风隔
同样从0开始
//创建形状(2,3,4)的3维数组
In [2]:a = np.arange(0,24).reshape(2,3,4)
In [3]:a
Out[3]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [4]:a[0,2,2] //索引
Out[4]: 10 //根据索引返回值
-
切片
每个维度切片用“,”风隔
可对每个维度单独切片
选去整个维度可用“:”,这与Python列表选取整个列表相同
每个维度可用步长跳跃切片
//创建形状(2,3,4)的3维数组
In [2]:a = np.arange(0,24).reshape(2,3,4)
In [3]:a
Out[3]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
//对每个维度切片
In [5]:a[:,1:2,:1]
Out[5]:
array([[[ 4]],
[[16]]])
//使用“:”选取整个维度,不对其切片
In [6]:a[:,:,0:3]
Out[6]:
array([[[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10]],
[[12, 13, 14],
[16, 17, 18],
[20, 21, 22]]])
//使用步长跳跃切片
In [7]:a[:,0::2,0::2]
Out[7]:
array([[[ 0, 2],
[ 8, 10]],
[[12, 14],
[20, 22]]])
PS:对多维数组的切片有点绕,不过仔细想想就明白了
ndarray数组运算
数组与标量之间的运算
- 数组与标量之间的运算作用于数组的每个元素
- .mean()计算数组平均值(即数组中每个元素之和 / 元素个数)
//创建形状(2,3,4)的3维数组
In [16]:a = np.arange(0,24).reshape(2,3,4)
In [17]:a
Out[17]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
//计算平均值
In [18]:a.mean()
Out[18]: 11.5
//每个元素都乘以4
In [19]:a*4
Out[19]:
array([[[ 0, 4, 8, 12],
[16, 20, 24, 28],
[32, 36, 40, 44]],
[[48, 52, 56, 60],
[64, 68, 72, 76],
[80, 84, 88, 92]]])
Numpy一元函数
- 对ndarray中的数据执行元素级运算的函数,即对每个元素都进行运算,返回结果
函数 | 说明 |
---|---|
np.abs(x) | 计算数组各元素的绝对值 |
np.fabs(x) | 计算数组各元素的绝对值 |
np.square(x) | 计算数组各元素的平方值 |
np.log(x) | 计算数组各元素的自然对数 |
np.log10(x) | 计算数组各元素的以10为底的对数 |
np.log2(x) | 计算数组各元素的以2为底的对数 |
np.ceil(x) | 计算数组各元素的大于其元素的最小整数值 |
np.floor(x) | 计算数组各元素的小于其元素的最大整数值 |
np.rint(x) | 将数组各元素四舍五入 |
np.modf(x) | 将各元素的小数和整数部分已两个独立数组返回 |
np.cos(x) | 计算数组各元素的cos值 |
np.sin(x) | 计算数组各元素的sin值 |
np.tan(x) | 计算数组各元素的tan值 |
np.cosh(x) | 计算数组各元素的双曲型三角函数cosh值 |
np.sinh(x) | 计算数组各元素的双曲型三角函数sinh值 |
np.tanh(x) | 计算数组各元素的双曲型三角函数tanh值 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值,正为1,其他为0 |
np.sqrt(x) | 平方根 |
Numpy二元函数
函数 | 说明 |
---|---|
+ - * / ** | 两个数组各元素进行对应运算 |
np.maximum(x,y) | 元素级的最大值计算 |
np.fmax(x,y) | 元素级的最大值计算 |
np.minimum(x,y) | 元素级的最小值计算 |
np.fmin(x,y) | 元素级的最小值计算 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中各元素值得符号赋值给数组x对应元素 |
> < >= <= == != | 算数比较,产生布尔型数组 |
注:不管对数组进行一元二元还是与标量之间的计算,只要返回的结果是数值型,返回数组的数据类型都为float64
如:
In [25]:a = np.arange(0,24).reshape(2,3,4)
//a的数据类型为‘int32’
In [26]:a.dtype
Out[26]: dtype('int32')
//对数组a进行开平方操作,得到数组b
In [27]:b = np.sqrt(a)
In [28]:b
Out[28]:
array([[[0. , 1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974, 2.64575131],
[2.82842712, 3. , 3.16227766, 3.31662479]],
[[3.46410162, 3.60555128, 3.74165739, 3.87298335],
[4. , 4.12310563, 4.24264069, 4.35889894],
[4.47213595, 4.58257569, 4.69041576, 4.79583152]]])
//对数组a与数组b比较其大小
In [29]:c = np.fmax(a,b)
In [30]:c
Out[30]:
array([[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]],
[[12., 13., 14., 15.],
[16., 17., 18., 19.],
[20., 21., 22., 23.]]])
//得到的结果的数据类型不是数组a的‘int32’,而是‘float64’
In [31]:c.dtype
Out[31]: dtype('float64')
给一个Numpy中文手册的连接