Python Scipy kstest为相似的值集返回不同的p值

Python Scipy kstest为相似的值集返回不同的p值,python,numpy,scipy,p-value,uniform-distribution,Python,Numpy,Scipy,P Value,Uniform Distribution,在Python 3.6.5和scipy 1.1.0中,当我运行Kolmogorov-Smirnov测试以检查均匀分布时,如果我向kstest函数提供行或列向量,我会得到两个相反的结果(从p值的角度来看): from scipy import stats import numpy as np >>> np.random.seed(seed=123) >>> stats.kstest(np.random.uniform(low=0, high=1, size=(

在Python 3.6.5和scipy 1.1.0中,当我运行Kolmogorov-Smirnov测试以检查均匀分布时,如果我向kstest函数提供行或列向量,我会得到两个相反的结果(从p值的角度来看):

from scipy import stats
import numpy as np

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(10000, 1)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.0)

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(1, 10000)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.00013567662455016283)
您知道为什么会出现这种情况吗?

中提到,当
kstest
的第一个参数是数组时,它应该是一维数组。在您的示例中,您传递的是二维数组(在每种情况下,其中一个维度是无关紧要的)。结果是,
kstest
中的代码在输入数组是二维的情况下不会达到预期效果

简单的解决方法是在将数组传递给
kstest
之前将其展平。可以使用
ravel()
方法来实现这一点。比如说,

In [50]: np.random.seed(seed=123)

In [51]: x = np.random.uniform(low=0, high=1, size=(10000, 1))

In [52]: stats.kstest(x.ravel(), 'uniform')
Out[52]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)

In [53]: np.random.seed(seed=123)

In [54]: x = np.random.uniform(low=0, high=1, size=(1, 10000))

In [55]: stats.kstest(x.ravel(), 'uniform')
Out[55]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)