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]?你知道吗
作为seaotternerd explains,您使用的是整数。在python2中(除非您
from __future__ import division
),用整数除以整数得到整数。你知道吗那么,为什么这三个都错了呢?好吧,看看价值观。在第一个例子中,和是40,len是8,40/8=5。在第三种情况下,10/5=2。但在第二种情况下,3/2=1.5。这就是为什么只有那一个得到错误的答案,当你做整数除法。你知道吗
那么,为什么NumPy也没有弄错第二个呢?NumPy不会将整数数组视为浮点数,而是将它们视为整数-} 的文档所解释的,“float64中间值和返回值用于整数输入”。而且,虽然我不确定这一点,但我猜他们是专门为避免这样的问题而设计的。你知道吗
print np.array(array).dtype
,您将看到int64
。然而,正如^{顺便说一句,如果您对浮点的平均值感兴趣,那么使用
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使用浮点除法:
对于第二组输入,最终会得到[-1,1],就像NumPy一样。你知道吗
相关问题 更多 >
编程相关推荐