一、Numpy库介绍

Numpy是Python的一种开源的数值计算扩展,可以用来存储和处理大型矩阵,比Python自带的嵌套列表结构要高效的多。

可以实现的功能:
  • 1、一个强大的N维数组对象Array;
  • 2、比较成熟的函数库;
  • 3、用于整合C/C++和Fortran代码的工具包;
  • 4、使用的线性代数、傅里叶变换和随机数生成函数;
  • 5、numpy和稀疏矩阵运算包scipy配合使用更加方便;
  • 6、numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行运算。

二、Numpy库的使用

1、array的创建
import numpy as np#导入numpy库的包
'''中括号[]的个数代表的矩阵的维度,dtype定义矩阵中元素的类型'''
c = np.array([[1,2,3],
             [4,5,6],
             [7,8,9]],dtype=int32)
'''生成一些特殊的矩阵'''
zero = np.zeros((3,4))#生成3行四列的一个矩阵
ones = np.ones((2,3))#生成2行3列全为1的矩阵
e = np.arange(10)
f = np.arange(2,11,3)#使用range方法生成矩阵
'''重新定义矩阵的形状,将矩阵转换为3行4列的矩阵'''
h = np.arange(12).reshape(3,4)
2、numpy的运算
arr1 = np.array([[1,2,3],
                [5,6,7]])
arr2 = np.array([[2,2,2],
                [3,3,3]])

矩阵之间的加减乘除、取余、整除和乘方的运算规则是按位运算的,矩阵的行列数要相同,例如:

print(arr1 + arr2)
'''输出结果为:
[[ 3  4  5]
 [ 8  9 10]]'''

矩阵的乘法参考线性代数中矩阵乘法的运算规则:

arr5 = np.dot(arr1,arr4)
arr6 = arr1.dot(arr4)
print(arr5)
print(arr6)
'''arr5和arr6的输出结构都为:
[[ 6.  6.  6.  6.]
 [18. 18. 18. 18.]]'''

矩阵还可以进行判断运算

arr3 = arr2 > 2
print(arr3)
'''arr2中大于2会输出True,小于2会输出False,所以输出如下:
[[False False False]
 [ True  True  True]]'''

矩阵的转置

'''一维的矩阵不能转置,可以将矩阵增加一个唯独后转置'''
arr1_1 = arr1[np.newaxis,:]#增加一个维度
arr1.T	#转置矩阵
'''atleast_2d代表至少2维的数据,如果不是二维矩阵会将arr1转变为二维矩阵'''
arr1_3 = np.atleast_2d(arr1)
print(arr1_3)
3、矩阵元素随机生成以及矩阵自身的运算
'''生成3行2列从0到1的随机数'''
sample1 = np.random.random((3,2))
'''生成3行2列符合标准正态分布的随机数'''
sample2 = np.random.normal(size=(3,2))
'''生成2行3列的1到10的随机整数'''
sample3 = np.random.randint(1,10,size=(2,3))
np.sum(sample1)#求和,矩阵中所有的元素
np.min(sample3)#找到矩阵中最小的元素
np.max(sample3)#找到矩阵中最大的元素
np.sum(sample3,axis=0)#对列求和
np.sum(sample3,axis=1)#对行求和
np.argmin(sample3)#求最小值的索引(从0开始数)
np.argmax(sample3)#求最大值的索引(从0开始数)
#求矩阵中所有元素的平均值
np.mean(sample1)
sample1.mean()
np.median(sample3)#求矩阵中所有元素的中位数
np.sqrt(sample3)#求矩阵的开方
np.sort(sample4)#对矩阵进行升序排序
np.clip(sample4,2,7)#将矩阵中大于7的数变为7,小于2的数变为2,中间的数不变
4、numpy的索引
arr1 = np.arange(2,14)
print(arr1[2])
print(arr1[1:4])#输出索引为1到4
print(arr1[2:-1])
print(arr1[:5])#输出索引0到5
arr2 = arr1.reshape(3,4)
print(arr2[2])#取索引为2的行
print(arr2[1][2])#取索引为1的行,索引为2的列的数
print(arr2[:,2])#提取索引为2的列

矩阵的迭代

for i in arr2:#按行迭代
    print(i)
for i in arr2.flat:#迭代所有元素
    print(i)
5、array的合并
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr3 = np.vstack((arr1,arr2))#按行合并矩阵
arr4 = np.hstack((arr1,arr2))#按列合并矩阵
arr = np.concatenate((arr3,arrv),axis=0)#axis=0按行合并,axis=1按列合并
6、array的分割
arr1 = np.arange(12).reshape((3,4))
arr2,arr3 = np.split(arr1,2,axis=1)#将arr1按列切割为两个矩阵,第一部分存在arr2里,arr3存在arr3中
'''有时候会出现矩阵在分割的时候,分割的个数与列数或者行数不同,可以用以下方法进行不平均分割'''
arr7,arr8,arr9 = np.array_split(arr1,3,axis=1)
arrv1,arrv2,arrv3 = np.vsplit(arr1,3)#vsplit代表按行分割
arrv1,arrv2 = np.hsplit(arr1,2)#hsplit代表按列分割
7、矩阵的浅拷贝和深拷贝
arr1 = np.array([1,2,3])
arr2 = arr1#arr1和arr2指向一个内存,浅拷贝
arr2[0] = 5 
print(arr1)
print(arr2)
'''输出结果为:
[5 2 3]
[5 2 3]'''

我们通过上面发现,arr2在改变的时候,arr1也会随之改变,这是因为arr1和arr2指向了一个内存,是属于浅拷贝,如果我们指向改变arr2而不想改变arr1的值,可以进行深拷贝,如下所示

arr3 = arr1.copy()#深拷贝
arr3[0] = 10
print(arr1)
print(arr3)
'''输出结果为:
[5 2 3]
[10  2  3]'''