Numpy学习笔记
什么是Numpy
- NumPy是一个功能强大的Python库,主要用于对多维数组执行计算,允许更高级的数据操作和数学计算。 它包括数学、逻辑、数组形状变换、排序、选择、I/O 、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。
- 机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
- 图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
- 数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
- Numpy安装:在shell上使用以下命令:
pip install numpy
。
Numpy基础知识
- NumPy的数组类被称为ndarray。别名为
array
。 请注意,numpy.array
与标准Python库类array.array
不同,后者仅处理一维数组并提供较少的功能。ndarray
对象则提供更关键的属性:- ndarray.ndim:数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
- ndarray.shape:数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有n行和m列的矩阵,shape将是(n,m)。因此,
shape
元组的长度就是rank或维度的个数ndim
。 - ndarray.size:数组元素的总数。这等于shape的元素的乘积。
- ndarray.dtype:一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
- ndarray.itemsize:数组中每个元素的字节大小。例如,元素为
float64
类型的数组的itemsize
为8(=64/8),而complex32
类型的数组的itemsize
为4(=32/8)。它等于ndarray.dtype.itemsize
。 - ndarray.data:该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。
经典例子
>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>
ndarray数组创建方法
-
利用python语言中的列表、元组来创建。
-
a = np.array(list/tuple)
-
-
数组的类型也可以在创建时明确指定:
-
c = np.array(list.tuple,dtype=np.float32)
-
-
利用Numpy中的函数创建特定的ndarray数组,shape是元组类型
函数 说明 np.arange(n) 使用和range()一样,类型为ndarray np.ones(shape) 创建一个全1数组 np.zeros(shape) 创建一个全0数组 np.full(shape,val) 创建一个全val数组 np.eye(n) 创建一个正方形n*n单位矩阵,对角线为1,其余为0 -
以np.full(shope,val)举例
d = np.full((2,3),3) #val不能省略 print(d) # 输出 [[3 3 3] [3 3 3]]
-
-
用已知数组形状来生成特定值数组,已知数组a
函数 说明 np.ones_like(a) 生成数组a形状的全1数组 np.zeros_like(a) 生成数组a形状的全0数组 np.full_like(a,val) 生成数组a形状的全val数组 -
以np.full_like(shope,val)举例
d = np.eye(2) print("d数组为:",d) e = np.full_like(d,2) print("e数组为:",e) # 输出 d数组为: [[1. 0.] [0. 1.]] e数组为: [[2. 2.] [2. 2.]]
-
-
其他创建数组方法
函数 说明 np.linspace() 根据数据等距填充到数组 np.concatenate() 将若干个数组合并成一个新的数组 ## np.linspace()示例 d = np.linspace(0,10,3) #第一个值为起始值,第二个值为结束值,第三个值为元素个数 #d数组为: [ 0. 5. 10.] d = np.linspace((10,10,10),(0,0,0),3)#第一个值为起始值,第二个值为结束值,第三个值为元素个数,这里把一维数组看作一个元素比较好理解 [[10. 10. 10.] [ 5. 5. 5.] [ 0. 0. 0.]] #注意:无论初始值和结束值是几维,这两个值形状一定要对应好,且两个值中的每个维度的所有项的形状相同
数组的维度变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 同上,但是是修改了原数组 |
.swapaxes(ar1,ar2) | 将数组n各维度中的两个维度进行调换 |
.flatten() | 对数组降维,返回一维数组,原数组不变 |
数组的类型变换
- new_array = array.astype(new_type),不改变原数组类型
数组向列表转换
- list1 = array.tolist()
将一个数组分成几个较小的数组
-
使用
hsplit
,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列:np.hsplit(a,3) # Split a into 3 p.hsplit(a,(3,4)) # Split a after the third and the fourth column
-
vsplit
沿纵轴分割,并且array_split
允许指定沿哪个轴分割。
数组运算
- 数组与标量之间的运算:数组中的每一个元素和标量进行运算
- 数组求和。np.sum(a) 或a.sum()
- 数组方差。np.var(a)
数组常见的几种值
方法 | 说明 |
---|---|
array.mean() | 数组所有元素的算术平均值 |
array.max() | 数组所有元素的最大值 |
array.min() | 数组所有元素的最小值 |
浅谈axis
a = [[[1 2 3 4][4 3 2 1]]
[[1 2 3 4][4 3 2 1]]]
a.shape = (2, 2, 4)#即从里到外共nol=3层
#以a.sum(axis=n) n可以是0,1,2的值,即最大为nol-1,也可以是-3,-2 -1的值,这里是和数组层数相关,为负数时是正数-层数即0-3=-3,所以看下一行
#a.sum(axis=0)和a.sum(axis=-3)结果相同
如上图所示有3层[],给上面三层[]编号n——从左到右分别是0,1,2;这里的n和上述a.sum(axis=n) 一致。
-
a.sum(axis=0) 即在第1层[]中对应元素相加之和,1+1=2,2+2=4,3+3=6.....3+3=6,2+2=4,1+1=2。整合结果为:
[[2 4 6 8] [8 6 4 2]]
-
a.sum(axis=1) 即在第2层[]中对应元素相加之和,1+4=5,2+3=5,3+2=5,4+1=5,1+4=5,2+3=5,3+2=5,4+1=5。整合结果为:
[[5 5 5 5] [5 5 5 5]]
-
a.sum(axis=2) 即在第3层[]中对应元素相加之和,1+2+3+4=10,4+3+2+1=10,1+2+3+4=10,4+3+2+1=10。整合结果为:
[[10 10] [10 10]]