一、方法
- 采用列表推导式
- 采用map函数+lambda函数
a = [1, 2, 3, 4, 5]
# 列表推导式
a_2 = [ k **2 for k in a]
a_2
Out[151]: [1, 4, 9, 16, 25]
# lambda函数
a_3 = list(map(lambda x: x**2, a))
a_3
Out[153]: [1, 4, 9, 16, 25]
二、应用
对列表数据进行最大/最小归一化或者是z-score标准化
import numpy as np
a = [1, 2, 3, 4, 5]
a_2 = [ ( k - np.min(a) ) / ( np.max(a) - np.min(a)) for k in a]
a_2
Out[156]: [0.0, 0.25, 0.5, 0.75, 1.0]
a_3 = list(map(lambda x:(x-np.min(a))/(np.max(a)-np.min(a)), a))
a_3
Out[167]: [0.0, 0.25, 0.5, 0.75, 1.0]
三、效率对比
采用%timeit计算对一条语句运行多次的平均时间
#列表数据量较小时
a = [1,2,3,4,5]
%timeit a_2 = [ (k-np.min(a))/(np.max(a)-np.min(a)) for k in a]
105 µs ± 7.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit a_3 = list(map(lambda x:(x-np.min(a))/(np.max(a)-np.min(a)), a))
101 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
#列表数据量较大时
a = [i for i in range(10000)]
%timeit a_2 = [ (k-np.min(a))/(np.max(a)-np.min(a)) for k in a]
19.7 s ± 176 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit a_3 = list(map(lambda x:(x-np.min(a))/(np.max(a)-np.min(a)), a))
20 s ± 170 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
结语:看来两个方法实力相当,看个人偏好选择列表推导式或者是map函数+lambda函数吧。
网友评论