> 技术文档 > NumPy核心操作全攻略

NumPy核心操作全攻略

        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))

这样我们就创建了一个数组(如果我们想创建一个多维数组对象,我们直接传入一个多维数组就行了),我们还查看了一下,我们创建了一个什么类型的数据,结果输出,这样我们就要记得,numpy创建的数据类型为

2 用可迭代对象arrang创建

import numpy as npr1 = np.arange(0,9,3)print(r1)

这里我们创建了一个一维的数组对象,可迭代对象内容为 [0 3 6]

3 用linspace创建

import numpy as npr2 = np.linspace(0,1,5)print(r2)

 先给出结果[0.   0.25 0.5  0.75 1.  ]

从结果可以看出,有三个参数,前两个为区间的左右两头数值,最后一个表示个数,要注意这个数组内容都是浮点型的,对于arrange相比,这个左右区间都是闭的。

4 创建特殊数组

import numpy as npa=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 npa=np.full((3,3),6)print(a)

输出结果:

我们可以看到,full可以提供两个参数,一个来控制矩阵的维度大小,另有一个控制填充值。

6 创建单位矩阵

import numpy as npa=np.eye(5,5)print(a)

 输出

这里我们输出了一个矩阵,对角线全一,如果列和行不相同,那么就从左一开始为一,大家可以试下。

另外我们可以通过对我们创建的这个多维数组对象进行查看

我们可以看到这里有许多方法 ,其中包含许多方法,例如reshape,dot,copy,ndim等等,下面我们来说些常用的

numpy常用操作

1 查看矩阵基本数据类型

import numpy as npa=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 nparray1 = 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 npa=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 npa=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 npa=np.array([1,2,3])c=a.repeat(3)print(c)

 输出

这个是将矩阵中每个值x参数个,不是数值x而是x个数。

6 选取

                        ​​​​​​​        

import numpy as npa=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 npa=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 npa=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 npa=np.array([[1,2,3],[4,5,6],[7,8,9]])b=a.Tprint(a)print(b)

输出直接用a.T来实现,这里也是生成了一个副本不是对源数据进行修改 

求逆

这里是求伪逆,不管这个矩阵有没有可逆,都可以求所以我们要验证下

import numpy as npa=[[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和array2a4 = np.hstack((array2, array1)) # 水平拼接array2和array1a5 = np.hstack((array1, array2, array1)) # 三数组水平拼接a6 = np.concatenate((array1, array2), axis=1) # 等价于vstackprint(a3)print(a4)print(a5)# 垂直组合(沿行方向拼接)a7 = np.vstack((array2, array1)) # 垂直拼接array2和array1print(a6)# 通用连接函数(axis=0为垂直方向)a8 = np.concatenate((array1, array2), axis=0) # 与vstack效果相同print(a8)

输出​​​​​​​

上面我们采用了三种方法,分别是三种方法一种垂直方向,一种水平方向,还有给用concatenate来实现。可以参照对应输出来看。