100道NumPy练习题(81-100题)
九、高级应用
81.实现一个简单的神经网络前向传播
import numpy as np
def name_df ( x) :
return 1 / ( 1 + np. exp( - x) )
def name_df1 ( X, W1, b1, W2, b2) :
df1 = name_df( X @ W1 + b1)
df2 = name_df( df1 @ W2 + b2)
return df2
X = np. random. randn( 3 , 4 )
W1 = np. random. randn( 4 , 5 )
b1 = np. random. randn( 5 )
W2 = np. random. randn( 5 , 2 )
b2 = np. random. randn( 2 )
print ( name_df1( X, W1, b1, W2, b2) )
[[0.22984593 0.17177491]
[0.23100834 0.24569817]
[0.51483635 0.20973028]]
82.计算两个矩阵的卷积
import numpy as np
from scipy. signal import convolve2d
a = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] )
b = np. array( [ [ 1 , 0 ] , [ 0 , 1 ] ] )
c = convolve2d( a, b, mode = 'valid' )
print ( c)
[[ 6 8]
[12 14]]
83.实现图像处理的滤波操作
import numpy as np
from scipy. ndimage import gaussian_filter
a = np. random. rand( 100 , 100 ) * 255
b = gaussian_filter( a, sigma = 1 )
print ( b)
[[ 96.10442953 120.1288878 151.99031853 ... 112.43626597 118.74521086
132.12891414]
[138.37809282 141.48093172 137.05956628 ... 111.98648986 131.84056391
159.27068649]
[150.80014813 146.35789743 123.35470412 ... 118.48287066 133.47683943
165.15880181]
...
[132.83672777 120.35783115 127.82728408 ... 159.75671433 147.01900961
111.26630156]
[129.94863549 133.97054461 146.86661964 ... 136.50809582 129.97185066
108.48076543]
[139.82624981 161.48509439 185.22881951 ... 113.5449542 118.14387918
119.25557167]]
84.计算数组的快速傅里叶变换
import numpy as np
a = np. array( [ 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ] )
b = np. fft. fft( a)
print ( b)
[ 4.+0.j 0.+0.j 0.+0.j 0.+0.j -4.+0.j 0.+0.j 0.+0.j 0.+0.j]
85.计算数组的逆傅里叶变换
import numpy as np
a = np. array( [ 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ] )
b = np. fft. ifft( a)
print ( np. real( b) )
[ 0.5 0. 0. 0. -0.5 0. 0. 0. ]
86.实现一个简单的PCA降维
87.计算数组的移动窗口统计量
88.实现数组的广播机制示例
89.使用NumPy实现线性回归
90.使用NumPy实现逻辑回归
十、性能优化
91.向量化操作替代循环
import numpy as np
import timeit
arr = np. random. rand( 10 ** 6 )
def name_df ( ) :
nums = 0
for x in arr:
nums += x** 2
return nums
def name_dfs ( ) :
return np. sum ( arr** 2 )
name1 = timeit. timeit( name_df, number = 10 )
name2 = timeit. timeit( name_dfs, number = 10 )
print ( f"向量化比循环快 { name1/ name2: .2f } 倍" )
向量化比循环快0.00倍
92.视图与拷贝的内存优化
import numpy as np
arr = np. random. rand( 10 ** 7 )
view = arr[ : len ( arr) // 2 ]
copy = arr[ : len ( arr) // 2 ] . copy( )
print ( f"视图内存占用: { view. nbytes: .2f } B" )
print ( f"拷贝内存占用: { copy. nbytes: .2f } B" )
视图内存占用:40000000.00B
拷贝内存占用:40000000.00B
93.选择合适的数据类型
import numpy as np
a = np. array( [ 100 , 200 , 300 ] , dtype = np. int32)
print ( a)
[100 200 300]
94.使用NumPy内置函数
import numpy as np
a = np. array( [ 1 , 2 , 3 ] )
print ( a)
[1 2 3]
95.避免重复计算中间结果
import numpy as np
arr = np. random. rand( 10 ** 6 )
print ( np. sum ( arr** 2 ) )
333313.16799442936
十一、综合项目面试解答
96.大型数据处理优化
题目:假设你有一亿元素的浮点数组,需要计算滑动平均(窗口大小为100),如何高效实现并避免内存问题?
解答:
1.可以使用numpy当中的创建滑动窗口视图函数方法去处理而非副本。
2.大型处理块这里可以使用将数组分成适当大小的块进行处理。
3.处理边界情况。
4.提供一个内存优化方案:优化浮点数组 的字节大小来减少内存占用。
97.多维数组操作
题目:给定一个形状为(100,100,3)的RGB图像数组,如何高效地:
1)转换为灰度图像,2)应用高斯模糊,3)找出所有亮度大于0.8的像素坐标。
解答:
1.进行灰度图像转换(避免循环)
2.使用广播方式实现向量化高斯模糊
3.条件查找像素坐标
98.性能关键型计算
题目:实现一个函数计算两个大型矩阵的余弦相似度矩阵,并优化其性能。
解答:
1.优化点积计算
2.广播机制避免循环
3.归一化处理使用向量化操作
99.内存高效算法
题目:处理两个形状为(1M,256)的矩阵的成对距离计算,如何避免内存错误?
解答:
1.使用分块处理技术
2.选择适当距离度量(如欧试距离)
3.考虑内存布局和连续性问题
4.使用对应形式重用内存
100.复杂统计计算
题目:实现一个函数计算大型数据集的滚动统计量(均值、标准差、偏度、峰度),窗口为100,步长为10。
解答:
1.创建滚动窗口
2.使用相关处理统计量函数去处理
3.优化内存访问模式
4.处理边界条件
小结
1、Python的生态无限宽广,有大量的第三方库支持。NumPy是一个开源的 Python 扩展库,它的主要作用是进行科学计算和数据分析。结合 Matplotlib、Pandas等库,NumPy 可以帮助生成各种数据可视化图表及更多的数据处理和数据分析。
2、练习题不是教材,只是抽取一些知识点练练手。Python解决实际问题时,核心的语句往往只有短短几行。
3、对初学者,强调建议安装Anaconda,这个软件目前还是免费的。虽然会占用很多空间(超5GB),但后续基本不需要安装第三方库,同时也包含了jupyter notebook,使用起来十分方便。
特别说明,上述题目已在jupyter notebook上运行过了。(完毕!)