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
发布于 2015-05-10 06:21:25
作为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。但是,正如np.mean的文档所解释的那样,"float64中间值和返回值用于整数输入“。而且,虽然我不太确定,但我想他们是这样设计的,专门为了避免这样的问题。
另外,如果您对浮点数感兴趣,那么仅使用sum / div还有其他问题。例如,[1, 2, 1e200, -1e200]的平均值应该是0.75,但是如果只做sum / div,就会得到0。(为什么?好吧,1 + 2 + 1e200 == 1e200.)您可能希望查看一个简单的统计库,即使您没有使用NumPy,以避免所有这些问题。在Python3中(本来可以避免您的问题),stdlib中有一个叫做statistics;在Python2中,您必须转到PyPI。
发布于 2015-05-10 05:17:19
在计算平均值时,不需要将数组中的数字转换为浮动。对于您的第二个或第三个输入来说,这不是一个问题,因为它们碰巧计算得很整齐(正如@abarnert所解释的那样),但是由于第二个输入并不是,并且完全由ints组成,所以当它应该是1.5时,最终计算出平均值为1。这会传播开来,导致您与使用NumPy函数的结果不一致。
如果用它替换计算平均值的行,这将迫使Python使用浮点除法:
mean = sum(array) / float(len(array))您最终将得到-1,作为第二组输入的结果,就像NumPy一样。
https://stackoverflow.com/questions/30147765
复制相似问题