内容:矩阵mat、通用函数、除法、线性计算等
1、矩阵
import numpy as np
# 创建矩阵
print("####创建矩阵####")
a = np.mat("1 2 3;4 5 6") # 通过str创建
b = np.mat(np.arange(10).reshape(5,2)) # 通过ndarray创建
c = np.matrix(np.arange(6).reshape(3,2)) # matrix函数创建
# 矩阵的属性
print("####矩阵的属性####")
transpose_a = a.transpose # 矩阵转置
transpose_a2 = a.T # 矩阵转置
inverse_a = a.I # 矩阵的逆
base_array_a = a.A # 基于矩阵的数组
hermitian_a = a.H # 共轭元素矩阵
# 矩阵的方法
print("####矩阵的方法####")
a.all() # 沿给定的轴判断矩阵中所有元素是否为真(0:假,1:真) true
a.any() # 沿给定的轴判断矩阵中任意元素是否为真,只要有一个不等于0即为真 true
a.argmax() # 沿给定的轴返回矩阵中最大元素的索引 5
a.argmin() # 沿给定轴返回矩阵中最小元素的索引 0
arr = np.array([[0, 4, 2], [0, 0, 5]])
arr.argsort() # 返回从小到大排序后的索引矩阵 [[0 2 1],[1 0 2]]
a.astype("float") # 更改矩阵中元素的数据类型
a.clip(1, 2) # 返回新的矩阵,比给定元素大的元素为2,比给定元素小的为1 [[1 2 2],[2 2 2]]
arr2 = a.copy() # 复制一个矩阵给另一个对象
a.cumsum() # 沿指定轴累计求和(保留中间解果)[1 3 6 10 15 21]
a.cumprod() # 沿指定轴累计求积
a.diagonal() # 返回对角线元素([1,5])
np.dot(a.T, b) # 矩阵点乘
a.dump(r"C:\Users505\Desktop\新建文本文档.txt") # 将矩阵存储为指定文件
a.dumps() # 将矩阵的数据转换成字符串
a.fill(10) # 将矩阵中所有元素填充为指定的value
a.getA() # 返回自己(ndarray)
a.getA1() # 返回扁平的一维数组
a.getT() # 返回转置矩阵
a.getI() # 返回逆矩阵
a.getH() # 返回共轭矩阵
a.max(axis=1) # 返回指定轴的最大值
a.min() # 返回指定轴的最小值
a.mean() # 返回指定轴的平均值
arr.nonzero() # 返回非零元素的索引矩阵
a.prod() # 返回矩阵元素的乘积 1000000
a.ptp() # 指定轴方向最大值减去最小值
a.put([0, 1, 4], [1, 2, 8]) # 用给定的value替换矩阵指定索引对应的元素
a.repeat(3, axis=1) # 重复矩阵中的每个元素,跨列
a.reshape((3, 2)) # 更改矩阵形状(拷贝)
a.resize((3, 2)) # 更改矩阵形状(视图)
a.sort() # 对矩阵进行排序(视图)
a.std()
a.sum()
a.swapaxes(0, 1) # 交换两个轴方向上的数据
a.take([1, 2, 3]) # 提取指定索引位置的数据
a.trace()
a.transpose()
a.var()
a.view() # 返回视图
2、通用函数ufunc
ufunc函数对象本身还有一些方法,这些方法只对两个输入,一个输出的ufunc函数有效,其他的ufunc对象调用这些方法会抛出valueError异常。
a = np.array([[1, 2, 3], [4, 5, 6]])
# 累计reduce()
np.add.reduce(a) # [5 7 9] 默认axis=0
np.add.reduce(a, axis=1) # [6,15]
# 累计accmulate(),保留中间计算结果
np.add.accumulate(a, axis=1) # array([[1,3,6],[4,9,15]])
# 累计reduceat()
# [1,2,3,3] a[0]=1,a[1]=2,a[0]+a[1]=3,a[2]=3
np.add.reduceat(np.array([1, 2, 3]), indices=[0, 1, 0, 2])
# outer()对其两个参数数组的每两个元素的组合进行计算
'''
*| 2 3 4
-----------
1| 2 3 4
2| 4 6 8
3| 6 9 12
4| 8 12 16
5|10 15 20
'''
np.multiply.outer([1,2,3,4,5],[2,3,4])
3、数组的除法运算(divide,true_divide,floor_division)
a = np.array([2, 6, 5])
b = np.array([1, 2, 3])
# divide和true_divide与数学中的除法定义接近,返回除法的浮点数结果(numpy version 1.13.3)
np.divide(a, b) # [ 2. 3. 1.66666667]
np.true_divide(a, b) # [ 2. 3. 1.66666667]
# floor_divide保留结果中的整数部分
np.floor_divide(a, b) # [2 3 1]
计算数组的余数(mod,remainder,fmod)
# 计算余数
a = np.arange(-4, 4)
# remainder函数逐个返回两个数组中元素相除后的余数,整除返回0
np.remainder(a, 2) # [0 1 0 1 0 1 0 1]
# mod与remainder功能一致
np.mod(a, 2) # [0 1 0 1 0 1 0 1]
# %为remainder的简写
print(a % 2)
# fmod函数处理负数不同,余数的正负号由被除数决定
print(np.fmod(a, 2)) # [ 0 -1 0 -1 0 1 0 1]
4、线性代数
线性代数是数学的一个重要分支,numpy.linalg模块包含线性代数的函数,使用这个模块可以计算矩阵的逆、特征值、求解线性方程组、求解行列式
4.1、求解矩阵的逆
print("####线性代数####")
matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
# 计算矩阵的逆
inverse_a1 = matrix_a.I
inverse_a2 = np.linalg.inv(matrix_a)
4.2、求解线性方程组
import numpy as np
# 解线性方程组
matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
b = np.array([0, 8, 3])
#使用solve函数求解齐次线性方程组
x = np.linalg.solve(matrix_a, b)
print(x) # [-10. 29. -16.]
4.3、求解特征值和特征向量
求解Ax=λx中的特征值λ和特征向量x,eigvals函数可以计算矩阵的特征值,eigvals求解矩阵的特征值,eig求解包含特征值和特征向量的元组
matrix_a = np.mat(np.array([[1, 2, 3], [6, 4, 3], [2, 3, 4]]))
b = np.array([0, 8, 3])
# 求解特征值
eigvals_a = np.linalg.eigvals(matrix_a)
# 求解特征向量和特征值
eig_a = np.linalg.eig(matrix_a)
4.4、奇异值分解
# 奇异值分解
U, Sigma, V = np.linalg.svd(matrix_a, full_matrices=False)
print(U, Sigma, V)
# 奇异值矩阵
sigma_matrix = np.diag(Sigma)