Numpy修改数组的地方?

我有下面的代码,试图规范mxn数组的值(它将被用作neural network的input,其中m是训练样本的数量, n是特征的数量)。

但是,当我在脚本运行后检查解释器中的数组时,我发现这些值没有正常化; 也就是说,他们仍然具有原始的价值。 我想这是因为函数内部的arrayvariables赋值只能在函数内部看到。

我怎样才能做到这一点正常化? 或者我必须从规范化函数返回一个新的数组?

 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() 

如果你想将math运算应用到一个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]) 

这些操作的原地版本启动速度要快一些,特别是对于较大的arrays:

 >>> 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 
 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] 

使用numpy时,有一个很好的方法可以进行就地规范化。 当应用于数组时, np.vectorizelambda函数结合使用时非常有用。 看下面的例子:

 import numpy as np def normalizeMe(value,vmin,vmax): vnorm = float(value-vmin)/float(vmax-vmin) return vnorm imin = 0 imax = 10 feature = np.random.randint(10, size=10) # Vectorize your function (only need to do it once) temp = np.vectorize(lambda val: normalizeMe(val,imin,imax)) normfeature = temp(np.asarray(feature)) print feature print normfeature 

可以将性能与生成器expression式进行比较,但是可能有许多其他方法来执行此操作。

 %%timeit temp = np.vectorize(lambda val: normalizeMe(val,imin,imax)) normfeature1 = temp(np.asarray(feature)) 10000 loops, best of 3: 25.1 µs per loop %%timeit normfeature2 = [i for i in (normalizeMe(val,imin,imax) for val in feature)] 100000 loops, best of 3: 9.69 µs per loop %%timeit normalize(np.asarray(feature)) 100000 loops, best of 3: 12.7 µs per loop 

所以vector化绝对不是最快的,但是在性能不那么重要的情况下可以传播。