37

配列の値を正規化しようとしている次のコードがありますm x n(これはニューラル ネットワークへの入力として使用されます。ここmで、トレーニング例nの数と特徴の数です)。

ただし、スクリプトの実行後にインタープリターで配列を調べると、値が正規化されていないことがわかります。つまり、元の値のままです。arrayこれは、関数内の変数への割り当てが関数内でしか見られない ためだと思います。

この正規化を適切に行うにはどうすればよいですか? または、正規化関数から新しい配列を返す必要がありますか?

import numpy

def normalize(array, imin = -1, imax = 1):
    """I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)"""

    dmin = array.min()
    dmax = array.max()

    array = imin + (imax - imin)*(array - dmin)/(dmax - dmin)
    print array[0]


def main():

    array = numpy.loadtxt('test.csv', delimiter=',', skiprows=1)
    for column in array.T:
        normalize(column)

    return array

if __name__ == "__main__":
    a = main()
4

4 に答える 4

29

+=インプレースのnumpy配列に数学演算を適用する場合は、標準のインプレース演算子、、など-=を使用できます/=。たとえば、次のようになります。

>>> def foo(a):
...     a += 10
... 
>>> a = numpy.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> foo(a)
>>> a
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

これらの操作のインプレースバージョンは、特に大規模なアレイの場合、起動が少し速くなります。

>>> def normalize_inplace(array, imin=-1, imax=1):
...         dmin = array.min()
...         dmax = array.max()
...         array -= dmin
...         array *= imax - imin
...         array /= dmax - dmin
...         array += imin
...     
>>> def normalize_copy(array, imin=-1, imax=1):
...         dmin = array.min()
...         dmax = array.max()
...         return imin + (imax - imin) * (array - dmin) / (dmax - dmin)
... 
>>> a = numpy.arange(10000, dtype='f')
>>> %timeit normalize_inplace(a)
10000 loops, best of 3: 144 us per loop
>>> %timeit normalize_copy(a)
10000 loops, best of 3: 146 us per loop
>>> a = numpy.arange(1000000, dtype='f')
>>> %timeit normalize_inplace(a)
100 loops, best of 3: 12.8 ms per loop
>>> %timeit normalize_copy(a)
100 loops, best of 3: 16.4 ms per loop
于 2012-04-13T23:20:58.763 に答える
4
def normalize(array, imin = -1, imax = 1):
    """I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)"""

    dmin = array.min()
    dmax = array.max()


    array -= dmin;
    array *= (imax - imin)
    array /= (dmax-dmin)
    array += imin

    print array[0]
于 2012-04-13T23:23:46.123 に答える