2012-04-13 75 views
2

Numpy新手在这里。我试图将我的输入规范化(也称为功能缩放,标准化)到神经网络。我只是做线性缩放和我使用的公式是:数组和标量的Numpy数学?

I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)

其中I是缩放的输入值,伊明和IMAX是所需分钟,经缩放的值的最大范围内,d是原始数据值以及Dmin和Dmax是原始数据值的最小和最大范围。我想要一个python方法,它接受一个numpy数组并返回一个数组,其中所有的值都被标准化了。这是我到目前为止的想法。

def get_normalized_values(array): 
    """I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)""" 
    imin = -1 
    imax = 1 
    dmin = array.amin() 
    dmax = array.amax() 

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

    return normalized 

我的问题是这个工作吗?或者我必须遍历数组中的每个元素并执行数学运算?你能用数组和标量做这样的数学吗?也就是说,array - dmin会创建一个新的临时数组,其中每个值都减去了dmin?不知道这是否是正确的术语,但我认为这是一种“矢量化”方法?

更新

是否有办法有这个修改到位数组?这不是返回数组的副本,让函数获取数组并修改原始数组?

+1

像这样的事情通常工作正常,只是尝试它。有一点是,氨和amax应该是最小和最大。或者argmin/argmax。 – 2012-04-13 21:28:09

回答

4

我相信你需要改变通话amin()amax()仅仅是min()max()电话,如my_array.max()

否则,这应该工作正常。您可以像NumPy一样在Octave/Matlab中执行操作,比如向数组中添加标量,并且它会自动知道将操作映射到所有元素。有时候,你可能需要稍微不同的语法(如知道numpy.linalg.dot()和仅乘以两个数组之间的区别),但通常情况下,这种情况与您所指出的一样简单。

+0

amin,amax和min,max有什么区别? – User 2012-04-13 21:38:18

+1

我不认为'amin()'是NumPy中数组类型的成员函数。我很肯定你使用'numpy.amin()'来计算轴上的最小值,并且'my_array.amin()'会抛出一个错误(当我在NumPy1.5.1中肯定会抛出一个错误测试你的代码)。适用于数组类型的方法是'min()'方法,如'my_array.min()'。所以如果你愿意,你可以选择调用'amin',但是你不能用数组名称后面的点语法来调用它。 – ely 2012-04-13 22:00:54

+0

此外,还有一个小的个人美学偏好。我经常使用NumPy函数'argmin()'来获取最小条目的索引。我不喜欢'min','argmin'和'amin'的潜在混淆。我倾向于只对数组类型使用类方法,并且避免通过调用'np.some_function(array)'应用任何数组操作。我试图坚持'array.some_function()',并且'amin()'没有这样的事情,它只能被称为'np.amin(array)'。 – ely 2012-04-13 22:05:20

2

它的蟒蛇 - 只是尝试它(TM)

我真的不知道答案,但我查不到将问题粘贴到IPython的终端会话的方式。通常每当我想知道如何在numby中做这样的事情,简单的方法已经奏效。

+0

+1只是试试吧! – unutbu 2012-04-13 21:25:09