实验三 、Numpy数组与矩阵运算

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您总结一下Numpy数组矩阵运算实验的内容。 NumpyPython中用于科学计算的一个重要的库,它提供了高性能的多维数组对象以及各种计算和操作这些数组的函数。Numpy数组矩阵运算实验主要包括以下内容: 1. Numpy数组的创建与索引:可以使用Numpy提供的array()函数创建一维或多维数组,并且可以使用索引和切片来访问数组中的元素。 2. Numpy数组的基本运算:Numpy提供了基本的数组运算,包括加、减、乘、除等,可以对数组进行逐元素的运算。 3. Numpy数组的聚合运算:Numpy提供了一些常用的聚合函数,比如sum()、min()、max()、mean()等,可以对数组中的元素进行聚合运算。 4. Numpy数组的逻辑运算:Numpy提供了逻辑运算符,可用于数组中元素的逻辑判断,如and、or等。 5. 矩阵的创建与运算:Numpy提供了矩阵对象,可使用matrix()函数创建矩阵矩阵之间的运算包括加、减、乘、转置等。 6. 广播:Numpy提供了广播功能,可以使得不同形状的数组在运算时具有相同的形状。 通过实验练习,可以掌握Numpy数组矩阵运算的基本操作,如数组创建、索引、运算、聚合、逻辑运算以及矩阵创建、运算、转置等。同时,实验也会涉及到一些高级的Numpy应用,比如随机数生成、线性代数运算、数组的拼接、切分和重塑等,这些内容需要结合实际应用场景进行练习。 总的来说,Numpy数组矩阵运算实验是Python科学计算中非常重要的部分,需要反复练习和实践,才能掌握这些知识点并灵活运用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值