【问题标题】:Numpy math with arrays and scalars?带有数组和标量的 Numpy 数学?
【发布时间】:2012-04-26 06:28:17
【问题描述】:

这里是麻木的新手。我正在尝试对神经网络的输入进行归一化(又名特征缩放、标准化)。我只是做线性缩放,我使用的公式是:

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

其中 I 是缩放的输入值,Imin 和 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 吗?不确定这是否是正确的术语,但我认为这是一种“矢量化”方法?

更新

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

【问题讨论】:

  • 这样的事情通常可以正常工作,请尝试一下。一件事是 amin 和 amax 应该只是 min 和 max。或 argmin/argmax。

标签: python numpy neural-network normalization


【解决方案1】:

我认为您需要将调用 amin()amax() 更改为调用 min()max(),如 my_array.max()

否则,这应该可以正常工作。你可以在 NumPy 中做一些类似于 Octave/Matlab 的事情,比如向数组添加一个标量,它会自动知道将操作映射到所有元素。有时,您可能需要稍有不同的语法(例如了解 numpy.linalg.dot() 之间的区别并仅将两个数组相乘),但一般情况下,如您所指出的那样简单。

【讨论】:

  • amin、amax和min、max有什么区别?
  • 我不相信amin()是NumPy中数组类型的成员函数。我很确定您使用numpy.amin() 来计算沿轴的最小值,并且my_array.amin() 会引发错误(当我在上面测试您的代码时,它肯定会在 NumPy 1.5.1 中引发错误)。为数组类型实现的正确方法是min() 方法,例如my_array.min()。所以你可以根据需要选择调用amin,但不能在数组名称后使用点语法来调用它。
  • 另外,还有一点个人审美偏好。我经常使用 NumPy 函数argmin() 来获取最小条目的索引。我不喜欢minargminamin 的潜在混淆。我倾向于只使用数组类型的类方法,并且避免通过调用np.some_function(array) 应用的任何数组操作。我尽量坚持array.some_function(),而amin()没有这种东西,只能叫np.amin(array)
  • 如果我的回答有帮助,请考虑接受。如果没有,请告诉我,我很乐意提供更多帮助。
  • 那是因为我修改了我的问题并希望得到编辑的答案。但我决定提出一个新问题:stackoverflow.com/questions/10149416/…
【解决方案2】:

这是 python - 试试吧 (tm)

我真的不知道答案,但我找出答案的方法是将问题粘贴到 iPython 终端会话中。一般来说,每当我想知道如何用简单的方法来麻木地做这样的事情时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多