【学习笔记】100道NumPy练习题(81-100题)

100道NumPy练习题(81-100题)

九、高级应用

81.实现一个简单的神经网络前向传播

import numpy as np

def name_df(x):
    return 1 /(1 + np.exp(-x))

#2层神经网络向前传播
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)

#方法1:循环计算
def name_df():
    nums = 0
    for x in arr:
        nums += x**2
        return nums

#方法2:向量化计算
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
#问题:存储0-255范围内的整数,使用哪种NumPy数据类型最节省内存?
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)
#如何计算是最省内存的

#错误写法
#names = arr**2
#s = np.sum(names)
#print(s)

#正确写法
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上运行过了。(完毕!)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值