我正在尝试编写一个 python 脚本来标准化与前面的条目相关的 -1 到 1 范围内的大量数据(> 10000 个条目)。
我目前正在做的是迭代集合并从迭代索引之前的 10 个索引到迭代索引(包括)对数据数组进行切片。然后,这允许我计算与之前 10 个条目相关的当前迭代条目。这可行,但在我的机器上需要很长时间。
我想知道是否有任何方法可以优化流程。我可以使用外部库,例如 pandas 和 numpy。
我非常清楚 python 数组、pandas 和 numpy 之间的性能差异,但我更感兴趣的是更通用的优化技术(如果存在),可在大多数情况下使用。 我正在寻找数学和通用算法优化,而不是直接的计算性能。
这是我的代码的简化表示:
def standardize_last(data):
min = data[0]
max = data[0]
for i in range(0, len(data)):
entry = data[i]
if entry < min:
min = entry
elif entry > max:
max = entry
if min == max:
return 0
else:
# 1. Shift range minimum to 0
# 2. Divide value by range to get a standard value from 0 to 1
# 3. Move to range from -1 to 1
return (((data[-1] - min) / (max - min)) * 2) - 1
results = []
dataset = [2,2,2,2,2,2,2,2,2,-2,-1,0,1,2,3,2]
# Standardize
for i in range(9, len(dataset)):
slice = dataset[i - 9:i + 1]
val = standardize_last(slice)
results.append(val)
print(results)
输出(结果从第9个数据集索引开始):
[-1.0, -0.5, 0.0, 0.5, 1.0, 1.0, 0.6000000000000001]
尝试使用矢量化运算:
from numpy.lib.stride_tricks import sliding_window_view
v = sliding_window_view(dataset, 10)
mn = v.min(1)
mx = v.max(1)
(v[:, -1] - mn)/(mx - mn) * 2 - 1
array([-1. , -0.5, 0. , 0.5, 1. , 1. , 0.6])