1.完成如下操作
1)a=np.array([[1,2,3],[4,5,6]])(查看数组的维度,数组元素的个数)。
2)将a数组的行变列,返回最后一个元素,返回第2到第4个元素,返回逆序的数组
3)a=np.arange(9).reshape(3,3)
b=np.arange(9).reshape(3,3)
x=np.arange(27).reshape(3,3,3)
将a、b数组水平合并,垂直合并,深度合并
4)将a数组水平拆分,垂直拆分,将x数组深度拆分
# 1.
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#查看数组的维度,数组元素的个数
print("数组的维度:",a.ndim)
print("数组元素的个数:",a.size)
# 2
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=a.transpose()
print("a数组的行变列:",b,sep='\n')
a=np.arange(9)
print("a: ",a)
print("最后一个元素:",a[-1:])
print("第2到第4个元素:",a[1:4])
print("逆序的数组:",a[9::-1])
#3.
import numpy as np
a=np.arange(9).reshape(3,3)
b=np.arange(9).reshape(3,3)
print(np.hstack((a,b)))
print(np.vstack((a,b)))
#4
import numpy as np
a=np.arange(9).reshape(3,3)
print("a: ",a)
print("水平拆分:")
print(np.hsplit(a,3))
print("垂直拆分:")
print(np.vsplit(a,3))
x=np.arange(27).reshape(3,3,3)
print("x: ",x)
print("深度拆分:")
print(np.dsplit(x,3))
2
利用Numpy产生正态分布图
import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
sampleNo = 1000;
# 一维正态分布, 下面三种方式是等效的
mu = 3
sigma = 0.1
np.random.seed(0)
s = np.random.normal(mu, sigma, sampleNo )
plt.subplot(141)
plt.hist(s, 30, density=True)
np.random.seed(0)
s = sigma * np.random.randn(sampleNo ) + mu
plt.subplot(142)
plt.hist(s, 30, density=True)
np.random.seed(0)
s = sigma * np.random.standard_normal(sampleNo ) + mu
plt.subplot(143)
plt.hist(s, 30, density=True)
# 二维正态分布
mu = np.array([[1, 5]])
Sigma = np.array([[1, 0.5], [1.5, 3]])
R = cholesky(Sigma)
s = np.dot(np.random.randn(sampleNo, 2), R) + mu
plt.subplot(144)
# 注意绘制的是散点图,而不是直方图
plt.plot(s[:,0],s[:,1],'+')
plt.show()
3已知矩阵[[-1,1,0],[-4,3,0],[1,0,2]],求矩阵的特征向量、特征值、矩阵的逆。
import numpy as np
A = np.array([[-1,1,0],[-4,3,0],[1,0,2]])
e, v = np.linalg.eig(A)
print(e, v,sep='\n')
x=np.matrix([[-1,1,0],[-4,3,0],[1,0,2]])
y=np.linalg.inv(x)
print(y)
4
x1=np.array([1,5,6,3,-1])
x2=np.arange(12).reshape(3,4)
利用Numpy求向量和矩阵的1,2范数,并说明其含义
import numpy as np
x1=np.array([1,5,6,3,-1])
x3=np.matrix(x1)
print(np.linalg.norm(x3,1),np.linalg.norm(x3));
x2=np.arange(12).reshape(3,4)
x4=np.matrix(x2)
print(np.linalg.norm(x4,1),np.linalg.norm(x4))
5.求解矩阵np.matrix([[1,2,3], [4,5,6], [7,8,9]])的奇异值分解结果。
import numpy as np
a=np.matrix([[1,2,3], [4,5,6], [7,8,9]])
u,s,v=np.linalg.svd(a)
print(u,s,v)
6
应用题,运行并理解下面程序,将运行结果截图上传。
SVD用于图像压缩
我们有多少次遇到过这个问题?我们喜欢用我们的智能手机浏览图像,并随机将照片保存。然后突然有一天 ,提示手机没有空间了!而图像压缩有助于解决这一问题。
它将图像的大小(以字节为单位)最小化到可接受的质量水平。这意味着你可以在相同磁盘空间中存储更多图像。
图片压缩利用了在SVD之后仅获得的一些奇异值很大的原理。你可以根据前几个奇异值修剪三个矩阵,并获得原始图像的压缩近似值,人眼无法区分一些压缩图像。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2
# 灰度化读取图片
img = cv2.imread('beach-2179624_960_720.jpg', 0)
# 得到svd
U, S, V = np.linalg.svd(img)
# 得到矩阵的形状
print(U.shape, S.shape, V.shape)
# 以不同component数绘制图像
comps = [638, 500, 400, 300, 200, 100]
plt.figure(figsize = (16, 8))
for i in range(6):
low_rank = U[:, :comps[i]] @ np.diag(S[:comps[i]]) @ V[:comps[i], :]
if(i == 0):
plt.subplot(2, 3, i+1), plt.imshow(low_rank, cmap = 'gray'), plt.axis('off'), plt.title("Original Image with n_components =" + str(comps[i]))
else:
plt.subplot(2, 3, i+1), plt.imshow(low_rank, cmap = 'gray'), plt.axis('off'), plt.title("n_components =" + str(comps[i]))
plt.savefig('svd.jpg')
plt.show()