14

私は巨大なデータセットを持っており、そこから 2 つのデータポイントのセットを導き出し、それらをプロットして比較する必要があります。これらの 2 つのプロットは範囲が異なるため、 の範囲に収まるようにします[0,1]。次のコードと特定のデータ セットでは、データセット プロットとして 1 で一定の​​線が得られますが、この正規化は他のセットでもうまく機能します。

plt.plot(range(len(rvalue)),np.array(rvalue)/(max(rvalue)))

およびこのコードの場合:

oldrange = max(rvalue) - min(rvalue)  # NORMALIZING
newmin = 0
newrange = 1 + 0.9999999999 - newmin
normal = map(
    lambda x, r=float(rvalue[-1] - rvalue[0]): ((x - rvalue[0]) / r)*1 - 0, 
    rvalue)
plt.plot(range(len(rvalue)), normal)

エラーが発生します:

ZeroDivisionError: float division by zero

すべてのデータセットに対して。比較のために両方のプロットを 1 つの範囲に収める方法がわかりません。

4

8 に答える 8

2

物事を少し単純化しようとしました。これを試して:

oldmin = min(rvalue)
oldmax = max(rvalue)
oldrange = oldmax - oldmin
newmin = 0.
newmax = 1.
newrange = newmax - newmin
if oldrange == 0:            # Deal with the case where rvalue is constant:
    if oldmin < newmin:      # If rvalue < newmin, set all rvalue values to newmin
        newval = newmin
    elif oldmin > newmax:    # If rvalue > newmax, set all rvalue values to newmax
        newval = newmax
    else:                    # If newmin <= rvalue <= newmax, keep rvalue the same
        newval = oldmin
    normal = [newval for v in rvalue]
else:
    scale = newrange / oldrange
    normal = [(v - oldmin) * scale + newmin for v in rvalue]

plt.plot(range(len(rvalue)),normal)

私が見ることができる唯一の理由はZeroDivisionError、右辺値のデータが定数であった場合です(すべての値が同じです)。そうですか?

于 2013-08-22T12:35:13.793 に答える