使用Numpy与硬编码的规范化

2024-06-16 12:57:45 发布

您现在位置:Python中文网/ 问答频道 /正文

import numpy as np
import math

def normalize(array):
    mean = sum(array) / len(array)
    deviation = [(float(element) - mean)**2 for element in array]
    std = math.sqrt(sum(deviation) / len(array))
    normalized = [(float(element) - mean)/std for element in array]

    numpy_normalized = (array - np.mean(array)) / np.std(array)

    print normalized
    print numpy_normalized
    print ""

normalize([2, 4, 4, 4, 5, 5, 7, 9])
normalize([1, 2])
normalize(range(5))

输出:

[-1.5, -0.5, -0.5, -0.5, 0.0, 0.0, 1.0, 2.0]
[-1.5 -0.5 -0.5 -0.5  0.   0.   1.   2. ]

[0.0, 1.414213562373095]
[-1.  1.]

[-1.414213562373095, -0.7071067811865475, 0.0, 0.7071067811865475, 1.414213562373095]
[-1.41421356 -0.70710678  0.          0.70710678  1.41421356]

有人能解释一下为什么这段代码在第二个例子中的行为不同,但在其他两个例子中的行为相似吗?你知道吗

在硬编码的示例中我做错了什么吗?NumPy怎么做才能得到[-1,1]?你知道吗


Tags: importnumpylennpmathelementfloatmean
2条回答

作为seaotternerd explains,您使用的是整数。在python2中(除非您from __future__ import division),用整数除以整数得到整数。你知道吗

那么,为什么这三个都错了呢?好吧,看看价值观。在第一个例子中,和是40,len是8,40/8=5。在第三种情况下,10/5=2。但在第二种情况下,3/2=1.5。这就是为什么只有那一个得到错误的答案,当你做整数除法。你知道吗

那么,为什么NumPy也没有弄错第二个呢?NumPy不会将整数数组视为浮点数,而是将它们视为整数-print np.array(array).dtype,您将看到int64。然而,正如^{}的文档所解释的,“float64中间值和返回值用于整数输入”。而且,虽然我不确定这一点,但我猜他们是专门为避免这样的问题而设计的。你知道吗


顺便说一句,如果您对浮点的平均值感兴趣,那么使用sum/div还有其他问题。例如,[1, 2, 1e200, -1e200]的平均值应该是0.75,但是如果你只做sum/div,你会得到0。(为什么?好吧,1 + 2 + 1e200 == 1e200)您可能需要查看一个简单的统计信息库,即使您没有使用NumPy,也可以避免所有这些问题。在python3中(这本来可以避免您的问题),stdlib中有一个名为statistics;在python2中,您必须转到PyPI。你知道吗

在计算平均值时,不能将数组中的数字转换为浮点数。对于第二个或第三个输入来说,这不是问题,因为它们恰好可以很好地计算出来(正如@abarnert所解释的),但是由于第二个输入没有,并且完全由int组成,因此当它应该是1.5时,您最终将平均值计算为1。这会通过传播,导致与使用NumPy函数的结果不一致。你知道吗

如果将计算平均值的行替换为,这将强制Python使用浮点除法:

mean = sum(array) / float(len(array))

对于第二组输入,最终会得到[-1,1],就像NumPy一样。你知道吗

相关问题 更多 >