在 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

  1. 使用statistics.mean([0, 1]);或
  2. 使用np.mean(np.array([0, 1])),或np.array([0, 1]).mean()