NumPy(Numerical Python)是 Python 生态中用于科学计算的核心库,提供高性能的多维数组对象(ndarray
)及相关的数学运算工具。其核心功能围绕数组操作、线性代数、随机数生成等,是数据科学、机器学习等领域的基础依赖。
numpy核心数据类型
NumPy 的核心是 ndarray
(N-dimensional array),一种高效存储和操作多维数据的容器。与 Python 原生列表相比,ndarray
支持矢量化运算,避免循环,显著提升性能。
- 特性:
- 固定大小,创建后不可变(元素可修改)。
- 所有元素类型相同(
dtype
指定)。 - 支持广播(Broadcasting)机制实现不同形状数组的运算。
numpy安装
这个我们可以直接在命令行窗口或者终端进行pip install numpy就行了,但是可能会比较慢,我们这里加上清华的镜像源
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
创建一个ndarray对象
1 直接创建
import numpy as npa=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13])
print(type(a))
这样我们就创建了一个数组(如果我们想创建一个多维数组对象,我们直接传入一个多维数组就行了),我们还查看了一下,我们创建了一个什么类型的数据,结果输出<class 'numpy.ndarray'>,这样我们就要记得,numpy创建的数据类型为<class 'numpy.ndarray'>
2 用可迭代对象arrang创建
import numpy as np
r1 = np.arange(0,9,3)
print(r1)
这里我们创建了一个一维的数组对象,可迭代对象内容为 [0 3 6]
3 用linspace创建
import numpy as np
r2 = np.linspace(0,1,5)
print(r2)
先给出结果[0. 0.25 0.5 0.75 1. ]
从结果可以看出,有三个参数,前两个为区间的左右两头数值,最后一个表示个数,要注意这个数组内容都是浮点型的,对于arrange相比,这个左右区间都是闭的。
4 创建特殊数组
import numpy as np
a=np.zeros(3)
print('一维:\n',a)
b=np.zeros((3,3))
print('二维:\n',b)
c=np.zeros((3,3,3))
print('三维:\n',c)
输出结果:
这里我们创建了几个全0矩阵,以为我们只能传入一个参数。那么我们要传入几个参数的术后,我们要传入一个数组,数组中几个数表示几位的。大小就是数组的那样n*n*n的,同样全一数组也是这样的,用np.ones()就不展示了。
5 full()创建矩阵
import numpy as np
a=np.full((3,3),6)
print(a)
输出结果:
我们可以看到,full可以提供两个参数,一个来控制矩阵的维度大小,另有一个控制填充值。
6 创建单位矩阵
import numpy as np
a=np.eye(5,5)
print(a)
输出
这里我们输出了一个矩阵,对角线全一,如果列和行不相同,那么就从左一开始为一,大家可以试下。
另外我们可以通过对我们创建的这个多维数组对象进行查看
我们可以看到这里有许多方法 ,其中包含许多方法,例如reshape,dot,copy,ndim等等,下面我们来说些常用的
numpy常用操作
1 查看矩阵基本数据类型
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print('矩阵形状',a.shape)
print('矩阵维度',a.ndim)
print('矩阵大小',a.size)
print('矩阵储存位置',a.data)
print('每个矩阵数据存储所占位置',a.itemsize)
输出结果
2 基本运算
import numpy as np
array1 = np.array([[1,2],[3,4]])
array2 = array1 * 2print(array1 + array2) # 加法
print(array1 - array2) # 减法
print(array1 * array2) # 乘法
print(array1 / array2) # 除法
print(array2 % array1) # 取余
print(array1 // array2) # 取整
输出结果
3 reshape方法
这个既可以升维度也可以降维度。
import numpy as np
a=np.array([1,2,3,4,5,6,7,8])
b=a.reshape(2,4)
c=a.reshape(2,-1)
print(a)
print(b)
print(c)
这里我展示了两种修改数据形状的方法,一种给出确定的大小,然后就可以转化到自己想要的了,还有一种给出一个确定的,剩下可以让机器自己算,注意这里要可以整除,不然会报错。
我们这里还要注意,a.reshape(2,4)是又创建了一个副本,并不是对原来的数据进行修改,如果要对原本数据进行修改,我们要对他进行赋值例如a=a.reshape(2,4).
4 resize()方法
import numpy as np
a=np.array([[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8]])
b=a.resize(2,2)
print(a)
print(b)
输出
resize是一个可以调整矩阵大小的方法。可以调整到自己指定的大小。这里调整后的数据是从第一行开始取,作为我们调整后的数据。
注意!这里a.resize(2,2)是一个None值,说明我们调整的是a原本数据
5 repeat
import numpy as np
a=np.array([1,2,3])
c=a.repeat(3)
print(c)
输出
这个是将矩阵中每个值x参数个,不是数值x而是x个数。
6 选取
import numpy as np
a=np.array([[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24]])
print(a[1:3,2:8])
结果
我们可以根据矩阵进行想列表中切片那样,进行选取,拿第一个参数表示第一维为例,如果是[0:3]就表示从第一行到第二行的全选中了,[1:]表示第二行以及后面的。后面参数也是这样。
7 flatten()
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=a.flatten()
print(b)
#c = a.ravel() 有相同的作用
输出
这个函数就相当于np.reshape(-1),revel也可以,但是flatten用到最多就是把矩阵展开变成一维的
8 矩阵的基本运算
点乘
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.dot(a,[[2,2,2],[2,2,2],[2,2,2]]))
print(a.dot([[2,2,2],[2,2,2],[2,2,2]]))
输出
这里我用了两种点乘的方法,输出结果一样。这里是矩阵与矩阵之间的相乘。
这里还有点需要注意的是,矩阵直接直接相乘是a*b,点乘是dot(a,b),矩阵直接相乘也可以a*2这样可以直接将矩阵的数值扩大二倍。
转置
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=a.T
print(a)
print(b)
输出直接用a.T来实现,这里也是生成了一个副本不是对源数据进行修改
求逆
这里是求伪逆,不管这个矩阵有没有可逆,都可以求所以我们要验证下
import numpy as np
a=[[1,2],[3,4]]
b=np.linalg.inv(a)
print(b)
print(np.dot(a,b))
输出
9 连接
import numpy as np# 生成基数组
array1 = np.array([[1,2,3],[4,5,6]])
array2 = np.array([[7,8,9],[10,11,12]])# 水平组合(沿列方向拼接)
a3 = np.hstack((array1, array2)) # 水平拼接array1和array2
a4 = np.hstack((array2, array1)) # 水平拼接array2和array1
a5 = np.hstack((array1, array2, array1)) # 三数组水平拼接
a6 = np.concatenate((array1, array2), axis=1) # 等价于vstack
print(a3)
print(a4)
print(a5)# 垂直组合(沿行方向拼接)
a7 = np.vstack((array2, array1)) # 垂直拼接array2和array1
print(a6)# 通用连接函数(axis=0为垂直方向)
a8 = np.concatenate((array1, array2), axis=0) # 与vstack效果相同
print(a8)
输出
上面我们采用了三种方法,分别是三种方法一种垂直方向,一种水平方向,还有给用concatenate来实现。可以参照对应输出来看。