我有一个二维 numpy 数组,我希望将每个元素四舍五入到序列中最接近的数字。数组有 shape (28000, 24)
。
例如,序列将是[0, 0.05, 0.2, 0.33, 0.5]
。
例如,原件0.27
将四舍五入为0.33
,并将0.42
四舍五入为0.5
这是我到目前为止使用的,但是双循环当然非常慢。
MWE:
arr = np.array([[0.14, 0.18], [0.20, 0.27]])
new = []
sequence = np.array([0, 0.05, 0.2, 0.33, 0.5])
for i in range(len(arr)):
row = []
for j in range(len(arr[0])):
temp = (arr[i][j] - sequence)**2
row.append(list(sequence[np.where(temp == min(temp))])[0])
new.append(row)
结果:
[[0.2000001, 0.2000001], [0.2000001, 0.33000001]]
动机:
在机器学习中,我在做预测。由于结果反映了专家的信心,因此可能是 2/3 给出了 1(因此为 0.66)。因此,在该数据中,会出现相对较多的 0、0.1、0.2、0.33、0.66、0.75 等。然而,我的预测类似于 0.1724。在这种情况下,我会通过四舍五入到 0.2 来消除很多预测误差。
如何优化舍入所有元素?
更新:我现在预先分配了内存,所以不必不断地追加。
# new = [[0]*len(arr[0])] * len(arr), then unloading into new[i][j],
# instead of appending
时间:
Original problem: 36.62 seconds
Pre-allocated array: 15.52 seconds
shx2 SOLUTION 1 (extra dimension): 0.47 seconds
shx2 SOLUTION 2 (better for big arrays): 4.39 seconds
Jaime's np.digitize: 0.02 seconds