2 次元の numpy 配列があり、各要素をシーケンス内の最も近い数値に丸めたいと思います。配列には形状があり(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