在 numpy 数组上应用统计方法:意外结果
Applying statistics methods on numpy arrays: unexpected results
请说明。
import statistics
x = [0,1]
statistics.mean(x)
## 0.5
但是:
import numpy
import statistics
x = numpy.array([0,1])
statistics.mean(x)
## 0
我很确定这是一个基本的、众所周知的、过度讨论的问题:请 link 复制一份,因为我找不到。
原因是 statistics
模块中有一个转换方法,它检查数据类型是否是 int
的子类。这适用于 int
,但不适用于 np.int32
。
import statistics
from fractions import Fraction
a = statistics._convert(Fraction('1/2'), int) # 0.5
b = statistics._convert(Fraction('1/2'), np.int32) # 0
def _convert(value, T):
"""Convert value to given numeric type T."""
if type(value) is T:
return value
#### THIS BIT WORKS FOR int BUT not for np.int32 ###
if issubclass(T, int) and value.denominator != 1:
T = float
try:
return T(value)
except TypeError:
if issubclass(T, Decimal):
return T(value.numerator)/T(value.denominator)
else:
raise
因此,您可以对列表使用 statistics
,或者对数组使用 numpy
:
- 使用
statistics.mean([0, 1])
;或
- 使用
np.mean(np.array([0, 1]))
,或np.array([0, 1]).mean()
。
请说明。
import statistics
x = [0,1]
statistics.mean(x)
## 0.5
但是:
import numpy
import statistics
x = numpy.array([0,1])
statistics.mean(x)
## 0
我很确定这是一个基本的、众所周知的、过度讨论的问题:请 link 复制一份,因为我找不到。
原因是 statistics
模块中有一个转换方法,它检查数据类型是否是 int
的子类。这适用于 int
,但不适用于 np.int32
。
import statistics
from fractions import Fraction
a = statistics._convert(Fraction('1/2'), int) # 0.5
b = statistics._convert(Fraction('1/2'), np.int32) # 0
def _convert(value, T):
"""Convert value to given numeric type T."""
if type(value) is T:
return value
#### THIS BIT WORKS FOR int BUT not for np.int32 ###
if issubclass(T, int) and value.denominator != 1:
T = float
try:
return T(value)
except TypeError:
if issubclass(T, Decimal):
return T(value.numerator)/T(value.denominator)
else:
raise
因此,您可以对列表使用 statistics
,或者对数组使用 numpy
:
- 使用
statistics.mean([0, 1])
;或 - 使用
np.mean(np.array([0, 1]))
,或np.array([0, 1]).mean()
。