文章目录
数组相关
创建数组
创建单一值矩阵
# 创建数组
# 1)使用单一值创建数组
# 创建具有10个元素的全0值数组
# * 参数为一个元组 *
zero1 = np.zeros((10,))
# 创建2x3的全零矩阵并制定对应元素的类型为int型
zero3 = np.zeros((2,3),dtype=np.int)
# 创建2x3的全1值二维数组
one1 = np.ones((2,3))
#利用numpy的广播机制对每一个元素乘以5的操作,创建2x3的二维数组,每个元素都是5
five1 = np.ones((2,3))*5
#创建3x3的单位矩阵
eye1 = np.eye(3)
# 从命令行获取数组的行列信息
m, n = map(float, input("请输入要创建的矩阵的行数和列数:").split())
eye2 = np.eye(int(m),int(n))
# 创建2x3的二维数组,不指定初始值(使用随机值)
without_init = np.empty((2,3),np.int32)
使用指定数据初始化数组
# 创建5个元素的一维数组,初始化为1,2,3,4,5
# * 参数为list 类型 *
num1 = np.array([1,2,3,4,5])
#%%
# 创建2x3的二维数组,用指定的元素值初始化
num2 = np.array([1,2,3,4,5,6]).reshape(2,3)
# a是 m x n 数组,根据a的维度生成 m x n 的全0值数组b
# 以指定的主对角线元素创建对角矩阵
# 先生成中间变量数组a,再由a来生成b
m,n = map(int, input("请输入要矩阵a的行数和列数:").split())
temp_a = np.ones((m,n))
b_init = np.zeros(tuple(temp_a.shape))
# 以指定的主对角线元素创建对角矩阵
temp_value = int(input("请输入指定值,接下来将根据这个值来创建对角矩阵"))
num3 = np.eye(5)*temp_value
按照一定规律生成数组
# 根据指定的间距,在[m,n)区间等距切分成若干个数据点,形成数组
m, n, s= map(float, input("请输入三个值:起始值(m)、终止值(n)
\和间隔值(s)来创建[m,n)之间且间隔为s的数组的:").split())
num1 = np.arange(m,n,s)
# 根据指定的切分点数量,在[m,n]区间等距切分成若干个数据点,形成数组
# 根据指定的切分点数量,在[m,n]区间等距切分成若干个数据点,形成数组
m, n ,s= map(float, input("请输入三个值:起始值(m)、终止值(n)和\
切割点数量(s)来创建[m,n)或是[m,n]之间且切割点数量为s的数组的:").split())
#要根据切割点的数量来计算出对应的间隔,起始实际创建的数组的长度为切割点数+1,
#则间隔为 (终点 (v1)- 起点(v2)) / (切割点数+1)
# 默认参数endpoint为True 即 [m,n]之间数据使用s 个点进行切分 (包括端点m与端点n)
# num2 = np.arange(m,n,(n-m)/(s+1))
num2 = np.linspace(m,n,int(s),endpoint=True)
num3 = np.linspace(m,n,int(s),endpoint=False)
print(num2)
print(num3)
# 数之间的间隔规则为更改为log
#生成指数间隔,并设置底数为2
num4 = np.logspace(0,5,base=2)
# 生成网格据点
# 可以理解为生成对应二维数组来表示坐标点
temp_X = np.linspace(1,3,5)
temp_Y = np.linspace(5,7,3)
num5 = np.meshgrid(temp_X,temp_Y)
数组的引用与拷贝
# 默认的copy为浅拷贝 和被拷贝的数组共用一个内存空间
import copy
a = [1,2,3,5]
print(id(a))
#进行一次浅拷贝
b = a
# 进行一次深拷贝
c = copy.deepcopy(a)
print("修改前的a[1]值为:",a[1],",b[1]的值为",b[1],",\
c[1]的值为",c[1],",a的id为",id(a)," b的id为:",id(b),"c的id为",id(c))
print("------------------\n")
b[1] = 12
c[1] = 15
print("修改后的a[1]值为:",a[1],",b[1]的值为",b[1],",\
c[1]的值为",c[1],",a的id为",id(a)," b的id为:",id(b),"c的id为",id(c))
数组的修改操作
改变数组维度
# 常用的为a.reshape() 注 a的tyep为numpy.ndarray
# 二维数组展成连续的一维数组
'''二维数组展成连续的一维数组
在numpy中存在两大类的数据扁平化的方法
- 第一类是先将numpy对象copy一份,并对这份copy出来的对象进行操作,
返回的是copy而原本的对象不会被改变,例如:flatten(),reshape() ,ravel()
- 第二类是直接对对象进行操作,而无返回值 如: resize()
'''
matrix1 = np.ones((6,3))
# 通过copy新生成新对象的方式修改shape
to_one = matrix1.ravel()
to_one2 = matrix1.flatten()
to_one3 = matrix1.reshape(matrix1.shape[0]*matrix1.shape[1],)
print(id(to_one),"|",id(to_one2),"|",id(to_one3))
print(to_one)
print(to_one2)
print(to_one3)
数组转置
#行数组转成列数组
temp_b = matrix1.reshape(1,18)
temp_T = temp_b.T
数组的拼接
temp1 = np.array([[3,2,1],[4,5,6]])
temp2 = np.array([[7,8,9],[10,11,12]])
#以竖直方向叠加两个数组
np.vstack((temp1,temp2))
运行结果:
# 以水平方向叠加两个数组
np.hstack((temp1,temp2))
运行结果:
数组的拆分
# 水平方向将二维数组拆分成若干个数组(意味着在水平方向上维度不发生改变)
# 官方文档介绍
# Split an array into multiple sub-arrays horizontally (column-wise).
# 等价于spilt指定维度axis为1,水平方向维度不发生改变
a,b,c = np.hsplit(temp1,3)
print(temp1)
print(a,"\n----\n",b,"\n----\n",c)
运行结果:
# 竖直方向拆分 (意味着在列方向上数据维度不发生改变)
# Split an array into multiple sub-arrays vertically (row-wise).
# 竖直方向维度不发生变化
# 等价于spilt指定维度axis为0,水平方向维度不发生改变
b,c = np.vsplit(temp1,2)
print(b,"\n-----\n",c)
运行结果:
访问和修改元素内容
访问部分元素
- 访问单个元素
# 创建二维数组
array1 = np.zeros((5,4))
print(array1[1][1])
运行结果:
- 访问多个元素
# 访问一维数组的部分元素
temp_one = np.array([1,33,4])
print(temp_one[0:2])
运行结果:
# 访问二维数组的部分元素
# 访问 0-1行 1-2列的数据元素
print(array1[0:2,1:3])
运行结果:
删除元素
# 删除行或列
array = np.array(list(range(0,12))).reshape(3,4)
print(array)
# 删除指定列
c = np.delete(array,[0,2],axis=1)
print(c)
# 删除制定行
c = np.delete(array,[0,2],axis=0)
print(c)
运行结果:
插入元素
- 插入行或者列
该函数的参数列表:
numpy.insert(arr, obj, values, axis=None)[source]
print(array)
a = np.insert(array,1,5,axis=None)
print(a)
# 插入一行
b = np.insert(array,1,[1,2,3,4],axis=0)
print(b)
#插入一列
c = np.insert(array,1,[1,2,5],axis=1)
print(c)
运行结果:
- 追加元素
函数参数列表
numpy.append(arr, values, axis=None)[source]
array1 = np.zeros((3,4))
print(array1)
a=np.append(array1,1)
print(a)
# # 追加行
b = np.append(array1,[[1,2,3,4],[1,2,4,3],[1,5,6,7]],axis=0)
print(b)
# 追加列
c = np.append(array1,[[1,2,3,4],[1,2,4,3],[1,5,6,7]],axis=1)
print(c)
运行结果:
# 在一个二维数组后添加一列
print(array1)
c=np.insert(array1,4,[1,2,3],axis=1)
print(c)
运行结果:
查找
# 检索符合条件的元素(请注意,所有返回结果与原数组都是独立的数据空间)
# 一维数组中,查找不为0的元素
# 新建一维数组
temp_arr = np.array([1,3,5,4,0,0])
print(temp_arr)
not_equal_zero = temp_arr !=0 # 在此处用到了传播机制
print(not_equal_zero)
c = temp_arr[not_equal_zero]
print(c)
运行结果:
# 二维数组中,查找不为0的元素
temp_arr2 = np.array([[1,3,0,5],[1,2,0,5]])
not_equal_zero2 = temp_arr2!=0
print(temp_arr2)
print(not_equal_zero2)
b = temp_arr2[not_equal_zero2]
print(b)
运行结果:
# 查找指定条件的元素
# 返回条件为True的元素
print(temp_arr2)
# 筛选条件
find_five_or_two = (temp_arr2==2) | (temp_arr2==5)
print(find_five_or_two)
# 返回指定索引的若干个元素
a = temp_arr2[find_five_or_two]
print(a)
运行结果:
排序
- 一维数组排序
# 将数组进行倒序操作
# 将数组倒序
# 新建一维数组
a =[1,3,5,7,9]
# b =a.reverse()
b= a[::-1]
print(b)
运行结果:
- 二维数组排序
# 一维数组排序
a = np.array([1,3,9,5])
temp = np.argsort(a)
print(temp)
print(a[temp])
运行结果:
# 二维数组排序
temp2 = np.array([[1,3,5,7],[7,1,6,10]])
print(temp2)
# 竖直方面以以第一维排序
out = np.sort(temp2,axis=0)
# 水平方面排序 第二维
out2 = np.sort(temp2,axis=1)
print(out)
print(out2)
运行结果:
- 以特定的值划分数据
运行结果:!
统计
- 一维数组相关
# 查找一维数组中的最大、最小值
num1 = np.array([1,2,6,8,7,9])
a = np.amax(num1)
print(a)
运行结果:
- 二维数组
# 查找二维数组总的最大、最小值
num2 = np.array([[1,3,5,7,4],[1,999,15,15,45]])
# max_num = np.amax(np.amax(num2,axis=0))
# min_num = np.amin(np.amin(num2,axis=0))
max_num = num2.max()
min_num = num2.min()
print(max_num)
print(min_num)
运行结果:
# 查找极值元素的索引 [row ,col]
# 等价于如下
# for i in num2.shape[0]:
# for j in num2.shape[1]:
# if num2[i,j]==max_num
print(np.argwhere(num2==max_num))
print(np.argwhere(num2==min_num))
运行结果:
- 统计满足条件的元素数目
# 统计数组中非零元素个数
print(num2.shape)
counts = len(np.argwhere(num2!=0))
print(counts)
运行结果:
# 计算数组算数平均值
average = num2.sum()/len(num2)
print("平均值为:{}".format(average))
运行结果:
# 计算数组的加权平均值
# (1x2)* (2x5)/sum(weights)--->1x5
weighted_mean = np.average(num2,axis =0,weights=(10,5))
print(weighted_mean)
运行结果:
矩阵相关
矩阵初始化
# 借助mat类,然后通过转置实现列向量
num6 = np.mat([1,3,5,6,8,9])
num7 = num6.T
print(num6.shape)
print(num7.shape)
num7
运行结果:
# 使用reshape方法, 将原来的一维数组变成了mx1形式的二维数组
print(type(num6))
num8 = num6.reshape(6,1)
print(num8.shape)
运行结果:
矩阵运算
乘以常数
# 各元素分别计算x1 * 5 + 2
# 创建向量
x1 = np.array([1,2,3,4,5])
x2= np.array([5,4,3,2,1])
c = x1*5+2
print(c)
运行结果:
点乘
# 对应元素分别相乘 (点乘)
# 要求矩阵的大小的规格一样
print(x1*x2)
运行结果:
# 除去这个形式还有使用'*'来进行想乘
x1 = np.array([1,2,3,4,5])
x2 = np.array([[1,2,3],[4,5,6]])
x3 = np.mat([[1,2,3],[4,5,6]])
r1 = x1 * 2
r2 = x2 * 2
r3 = x3 * 2
print(r1,"\n----\n",r2,"\n----\n",r3,"\n----\n")
运行结果:
矩阵乘法
# 创建矩阵
matrix1 = np.mat([[2,3,4],[5,8,2]])
print(matrix1)
matrix2 = np.mat([[2],[1],[6]])
print(matrix2)
# 矩阵与向量乘积
c = matrix1.dot(matrix2)
print(matrix1)
print(matrix2)
print(c)
运行结果:
1) mat 类型
# 矩阵与矩阵乘积
# 新建矩阵matrix3
matrix3 = np.mat([[2,1],[1,0],[6,7]])
print(matrix1)
print(matrix3)
d = matrix1.dot(matrix3)
print(d)
运行结果:
在此处可以使'*'对矩阵与矩阵进行运算,A * B 且A 和B 都为矩阵类型的时候使用的矩阵乘法的规则
A1= np.mat([[1,2,3],[4,5,6]])
A2 = np.mat([[1,2],[3,4],[5,6]])
x1= np.mat([[1],[2],[3]])
r1 = A1 * A2
r2 = A1 * x1
#在对矩阵之间进行相乘的时候为矩阵乘法的规则
# r2=A1.dot(x1)
print(r1,'\n-----------\n',r2)
运行结果:
2) array(数组形式)矩阵
# 创建矩阵和向量(列向量、行向量)
temp_arr0 = np.array([[3,4,6],[1,5,6]])
print(temp_arr0)
temp_arr01 = np.array([1,3,6,4])
print(temp_arr01)
temp_arr02 = np.array([[1],[2],[5],[7]])
print(temp_arr02)
# 生成特殊矩阵
# 创建矩阵和向量(列向量、行向量)
temp_arr0 = np.array([[3,4,6],[1,5,6]])
print(temp_arr0)
temp_arr01 = np.array([1,3,6,4])
print(temp_arr01)
temp_arr02 = np.array([[1],[2],[5],[7]])
print(temp_arr02)
# 生成特殊矩阵
a1 =np.zeros((2,3))
a2=np.ones([2,3])
a3 =np.identity(3)
a4=np.diag([1,2,3,4])
print(a1,'\n----\n',a2,'\n----\n',a3,'\n----\n',a4,'\n')
运行结果:
小结一下:
在进行矩阵乘法的使用虽然使用乘号’*'也能够很好的进行矩阵运算,但是最好还是使用A.dot(B)的形式来进行运算便于区分
矩阵操作
矩阵的逆
A1 = np.array([[2, 2, 3],[1, -1, 0],[-1, 2, 1]])
print(A1)
A2 = np.linalg.inv(A1)
print(A2)
运行结果:
矩阵转置
A1 = np.array([[2, 2, 3],[1, -1, 0],[-1, 2, 1]])
A3 = A1.T
print(A3)
运行结果:
特征分解
A = np.array([[2, 2, 3],[1, -1, 0],[-1, 2, 1]])
# 同时计算特征值和特征向量
eigvals ,eigvectors = np.linalg.eig(A1)
print(eigvals,'\n----\n',eigvectors)
运行结果:
SVD分解
A1 = np.array([[2, 2, 3],[1, -1, 0],[-1, 2, 1]])
A2 = np.array([[2,2,3],[4,4,6],[-1, 2, 1]])
A3 = np.array([[2,2,3],[1, -1, 0],[-1, 2, 1], [-3,1,2]])
# 使用numpy内置函数计算
print(np.linalg.svd(A1))
print('-----------')
print(np.linalg.svd(A2))
print('-----------')
print(np.linalg.svd(A3))
运行结果:
矩阵的秩
A1 = np.array([[2, 1, 3],[6, 6, 10],[2, 7, 6]])
A2 = np.array([[2, 1, 3],[4, 2, 6],[2, 7, 6]])
A3 = np.array([[2, 1, 3],[6, 6, 10],[2, 7, 6],[1,3,5]])
print(np.linalg.matrix_rank(A1))
print('-----------')
print(np.linalg.matrix_rank(A2))
print('-----------')
print(np.linalg.matrix_rank(A3))
运行结果: