NumPy 与Matplotlib 作业2022
1、创建一个100000长度的随机数组,使用两种方法对其求三次方,并比较所用时间
import numpy as np
def sum_python(ary):
temp = []
for i in range(len(ary)):
temp.append(ary[i]**3)
return temp
def sum_numpy(ary):
return ary**3
a = np.random.rand(100000)
%timeit -n 10 sum_python(a)
%timeit -n 10 sum_numpy(a)
# 时间结果:
108 ms ± 18.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
8.76 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
发现Numpy方法的时间要远小于python方法
2、创建一个5*3随机矩阵和一个3*2随机矩阵,求矩阵积
import numpy as np
Ma_1 = np.matrix(np.random.rand(5,3))
Ma_2 = np.matrix(np.random.rand(3,2))
print(Ma_1*Ma_2)
# 矩阵乘积结果:
[[1.19647269 0.96521576]
[1.07259398 0.87169754]
[0.89269422 0.42897571]
[0.27013765 0.23504708]
[0.89707348 0.67875545]]
3、矩阵的每一行的元素都减去该行的平均值
import numpy as np
Ma = np.matrix(np.random.rand(5,5))
print(Ma - Ma.mean(axis=1))
# 结果:
[[-0.15157967 0.22187148 0.27537962 -0.60743129 0.26175986]
[ 0.47047551 -0.14092872 -0.47222105 -0.13748633 0.28016059]
[-0.14921571 -0.02700586 -0.15212659 -0.23756921 0.56591737]
[ 0.02641876 0.306315 -0.44702438 0.10964596 0.00464465]
[ 0.31959287 -0.03783668 -0.2307182 -0.01001591 -0.04102209]]
4、正则化一个5*5随机矩阵
正则的概念:假设a是矩阵中的一个元素,max/min分别是矩阵元素的最大最小值,则正则化后a = (a - min)/(max - min)
import numpy as np
Ma = np.matrix(np.random.rand(5,5))
maxa = Ma.max()
mina = Ma.min()
print((Ma - mina)/(maxa - mina))
# 正则化结果:
[[0.6637692 0.94956831 0.309877 0.53604182 0.29724287]
[0.52161554 0.91461689 0.26880635 0.93652537 0.75520014]
[0.70869268 0.79627382 0.50627554 0.1316578 1. ]
[0.21756953 0.21751428 0.48819966 0.3592749 0. ]
[0.41166455 0.27998541 0.91691498 0.89417939 0.5746174 ]]
5、将一个一维数组转化为二进制表示矩阵。
例如 [123] 转化为 [ [001] [010] [011] ]
import numpy as np
def trans(ary):
num = len(ary)
n_trans = np.zeros(shape=(num,num),dtype='int')
for i in range(num):
n = ary[i]
for j in range(num-1,-1,-1):
n_trans[i][j] = n%2
n = n//2
return n_trans
targ = [1,2,3]
print(trans(targ))
[[0 0 1]
[0 1 0]
[0 1 1]]
6、实现冒泡排序法
def BubbleSort(ary):
n = len(ary)
for i in range(n):
for j in range(0, n-i-1):
if ary[j] > ary[j+1] :
ary[j], ary[j+1] = ary[j+1], ary[j]
return ary
targ = [1, 23, 3, 45, 37, 91, 65, 6, 78, 9]
print(targ)
print(BubbleSort(targ))
[1, 23, 3, 45, 37, 91, 65, 6, 78, 9]
[1, 3, 6, 9, 23, 37, 45, 65, 78, 91]
7、画出如下图的各通道灰度直方图,并分析灰度均值、方差、最大最下。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
img = np.array(Image.open('7.png'))
_, axes = plt.subplots(1, 3, figsize=(10,3))
colus = 'RGB'
for i, ax in enumerate(axes):
temp = img[...,i].reshape(-1)
ax.hist(temp, bins=50)
ax.set_title(colus[i])
print(f"Channel-{colus[i]}: mean={np.mean(temp):4f},
std={np.std(temp):4f}, max={np.max(temp)}, min={np.min(temp)}")
plt.show()
Channel-R: mean=179.404227, std=49.286937, max=255, min=33
Channel-G: mean=100.325870, std=53.615759, max=240, min=0
Channel-B: mean=106.383851, std=34.810739, max=217, min=32
8、画出不通初值的函数曲线。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 1, 0.01)
def eluer(y0):
def fun(x, y):
return x**2 + y**2
step = 99
u = [y0] + [0 for i in range(step)]
for i in range(step):
u[i+1] = u[i] + 0.01 * fun(x[i],u[i])
return u[1:]
fig = plt.figure()
ax = fig.gca()
for init in [-1, 0, 0.3, 0.5, 0.8]:
w = eluer(init)
ax.plot(x[1:], w, label=f"y[0] = {init}")
ax.legend()
plt.show()