# Numpy修改数组的地方？

` `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.vectorize``lambda`函数结合使用时非常有用。 看下面的例子：

` `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化绝对不是最快的，但是在性能不那么重要的情况下可以传播。