什么是Numpy?
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
如何安装Numpy?
博主用的Python3编译器,命令行下的安装为 pip3 install numpy
安装时如果遇到各种问题请移步 这里(英文不好可以使用Chrome对网页进行翻译)
Numpy的应用
Numpy的属性
首先我们来介绍几种简单的属性
ndim:维度
shape:行数和列数
size:元素个数
我们用下面这段代码来举例说明几种属性的应用情况
#array的用法下面会讲到
import numpy as np array = np.array([[1,2,3],[2,3,4]]) #列表转化为矩阵 print(array) print('维度:',array.ndim) # 维度 print('行数,列数 :',array.shape) # 行数和列数 print('元素个数:',array.size) # 元素个数
输出结果如下
[[1 2 3]
[2 3 4]]
维度: 2
行数,列数 : (2, 3)
元素个数: 6
Numpy的array操作
在上面的一段代码中我们用到了array这个属性,该属性用于创建数组,它的几个属性如下
array:创建数组
dtype:指定数据类型
zeros:创建数据全为0
ones:创建数据全为1
empty:创建数据接近0
arrange:按指定范围创建数据
reshape:改变数据的形状
linspace:创建线段
代码应用
array:创建数组
a = np.array([2,3,4]) # 创键一个一维数组 b = np.array([[2,2,4],[2,3,4]])#创建一个2行3列的数组 print(a) # 该数组为[2 3 4]
dtype:指定数据类型
a = np.array([2,3,4],dtype=np.int) print(a.dtype) # int 64 a = np.array([2,3,4],dtype=np.int32) print(a.dtype) # int32 a = np.array([2,3,4],dtype=np.float) print(a.dtype) # float64 a = np.array([2,3,4],dtype=np.float32) print(a.dtype) # float32
zeros:创建数据全为0
ones:创建数据全为1
empty:创建数据全为空(所创建的数据接近0)
a = np.zeros((3,4)) # 数据全为0,3行4列
a = np.ones((3,4),dtype = np.int) # 数据为1,3行4列
a = np.empty((3,4)) # 数据为empty,3行4列
arrange:按指定范围创建数据
a = np.arange(10,100,2) # 10-100 的数据,2步长
reshape:改变数据的形状
a = np.arange(12).reshape((3,4)) # 3行4列,0到11
linspace:创建线段型数据
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段
Numpy的运算
我们先建立两个一维矩阵
import numpy as np a=np.array([10,20,30,40]) # array([10, 20, 30, 40]) b=np.arange(4) # array([0, 1, 2, 3]) 上文中提到过的创建方法
不难看出我们建立的两个矩阵都是一行四列的对于一些普通的计算可以试着输入
c=a-b # array([10, 19, 28, 37]) c=a+b # array([10, 21, 32, 43]) c=a*b # array([ 0, 20, 60, 120])
c=b**2 # array([0, 1, 4, 9]) **在numpy中表示乘方
如果你想用到一些数学函数,比如三角函数
c=10*np.sin(a) # array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])
或者进行一些逻辑判断
print(b<3) # array([ True, True, True, False], dtype=bool)
此处需要注意,正常情况下我们的判断用到了> < 但是判断是否相等的时候一定要用==而不是=
如果我们想对多维的矩阵进行操作
先对我们的矩阵进行一些修改
a=np.array([[1,1],[0,1]]) b=np.arange(4).reshape((2,2)) print(a) # array([[1, 1], # [0, 1]]) print(b) # array([[0, 1], # [2, 3]])
我们对矩阵进行乘法运算
c_dot = np.dot(a,b) # array([[2, 4], # [2, 3]]
另一种表示方法
c_dot_2 = a.dot(b) # array([[2, 4], # [2, 3]])
再来说一下对 sum(),min(),max()的使用
import numpy as np a=np.random.random((2,4)) print(a) #array[[0.44170864 0.55546057 0.20811773 0.31393565] # [0.77267586 0.37477637 0.57271214 0.91471081]] print(np.sum(a)) #求和 4.154097777084038 print(np.min(a)) #求最小值 0.2081177326626824 print(np.max(a)) #求最大值 0.9147108137831268
如果你需要对行或者列进行查找运算,就需要在上述代码中为 axis 进行赋值。 当axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。
对于刚才的例子我们继续查找
print("sum =",np.sum(a,axis=1))#sum = [1.51922259 2.63487519] print("min =",np.min(a,axis=0))#min = [0.44170864 0.37477637 0.20811773 0.31393565] print("max =",np.max(a,axis=1))#max = [0.55546057 0.91471081]
在平时的使用过程中,对应元素的索引也是很重要的,从下面的一个脚本开始
import numpy as np A = np.arange(2,14).reshape((3,4)) # array([[ 2, 3, 4, 5] # [ 6, 7, 8, 9] # [10,11,12,13]]) print(np.argmin(A)) # 0 print(np.argmax(A)) # 11
argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。
cumsum()函数:生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。比如元素9,在cumsum()生成的矩阵中序号为3,即原矩阵中2,3,4三个元素的和。
print(np.cumsum(A)) # [2 5 9 14 20 27 35 44 54 65 77 90]
对应的累差运算函数:该函数计算的便是每一行中后一项与前一项之差。故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
print(np.diff(A)) # [[1 1 1] # [1 1 1] # [1 1 1]]
nonzero()函数:这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
print(np.nonzero(A)) # (array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))
同样的,我们可以对所有元素进行仿照列表一样的排序操作,但这里的排序函数仍然仅针对每一行进行从小到大排序操作:
import numpy as np A = np.arange(14,2, -1).reshape((3,4)) # array([[14, 13, 12, 11], # [10, 9, 8, 7], # [ 6, 5, 4, 3]]) print(np.sort(A)) # array([[11,12,13,14] # [ 7, 8, 9,10] # [ 3, 4, 5, 6]])
矩阵的转置
print(np.transpose(A)) print(A.T) # array([[14,10, 6] # [13, 9, 5] # [12, 8, 4] # [11, 7, 3]]) # array([[14,10, 6] # [13, 9, 5] # [12, 8, 4] # [11, 7, 3]])
clip函数()
函数的格式是clip(Array,Array_min,Array_max),顾名思义,Array指的是将要被执行用的矩阵,而后面的最小值最大值则用于让函数判断矩阵中元素是否有比最小值小的或者比最大值大的元素,并将这些指定的元素转换为最小值或者最大值。
print(A) # array([[14,13,12,11] # [10, 9, 8, 7] # [ 6, 5, 4, 3]]) print(np.clip(A,5,9)) # array([[ 9, 9, 9, 9] # [ 9, 9, 8, 7] # [ 6, 5, 5, 5]])
Numpy索引
在元素列表或者数组中,我们可以用如同a[2]一样的表示方法,同样的,在Numpy中也有相对应的表示方法:
import numpy as np A = np.arange(3,15) # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) print(A[5]) # 8
二位矩阵
A = np.arange(3,15).reshape((3,4)) """ array([[ 3, 4, 5, 6] [ 7, 8, 9, 10] [11, 12, 13, 14]]) """ print(A[2]) # [11 12 13 14]
实际上这时的A[2]对应的就是矩阵A中第三行(从0开始算第一行)的所有元素。
如果你想要表示具体的单个元素,可以仿照上述的例子:
print(A[1][1]) # 8
print(A[1, 1]) # 8
在Python的 list 中,我们可以利用:对一定范围内的元素进行切片操作,在Numpy中我们依然可以给出相应的方法:
print(A[1, 1:3]) # [8 9]
利用for函数进行打印:
for row in A: print(row) """ [ 3, 4, 5, 6] [ 7, 8, 9, 10] [11, 12, 13, 14] """
如果想进行逐列打印,就需要稍稍变化一下:
for column in A.T: print(column) """ [ 3, 7, 11] [ 4, 8, 12] [ 5, 9, 13] [ 6, 10, 14] """
迭代输出
import numpy as np A = np.arange(3,15).reshape((3,4)) print(A.flatten()) # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) for item in A.flat: print(item) # 3 # 4 …… # 14
这一脚本中的flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。
Numpy array 合并
对于一个array的合并,我们可以想到按行、按列等多种方式进行合并。首先先看一个例子:
import numpy as np A = np.array([1,1,1]) B = np.array([2,2,2]) print(np.vstack((A,B))) # vertical stack """ [[1,1,1] [2,2,2]] """
vertical stack本身属于一种上下合并,即对括号中的两个整体进行对应操作
左右合并:
D = np.hstack((A,B)) # horizontal stack print(D) # [1,1,1,2,2,2]
当你的合并操作需要针对多个矩阵或序列时,借助concatenate函数可能会更好
C = np.concatenate((A,B,B,A),axis=0) print(C) """ array([[1], [1], [1], [2], [2], [2], [2], [2], [2], [1], [1], [1]]) """ D = np.concatenate((A,B,B,A),axis=1) print(D) """ array([[1, 2, 2, 1], [1, 2, 2, 1], [1, 2, 2, 1]]) """
axis参数很好的控制了矩阵的纵向或是横向打印,相比较vstack和hstack函数显得更加方便
Numpy array 分割
说完了合并我们自然要讲到如何去分割他们
建立一个3行4列的矩阵
A = np.arange(12).reshape((3, 4)) print(A) """ array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) """
纵向分割
print(np.split(A, 2, axis=1)) """ [array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])] """
横向分割
print(np.split(A, 3, axis=0)) # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
不等量分割
print(np.array_split(A, 3, axis=1)) """ [array([[0, 1], [4, 5], [8, 9]]), array([[ 2], [ 6], [10]]), array([[ 3], [ 7], [11]])] """