Scipy 沿多个切片计算 Mann Whitney U
Scipy Compute Mann Whitney U along Multiple Slices
给定以下数组:
import numpy as np
from scipy.stats import mannwhitneyu
s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])
我想 运行 对相应样本的每个切片进行一次 Mann-Whitney(-Wilcoxon) U 测试,并将结果填充到一个输出数组中,其中一个切片用于 U 统计量,另一个切片对于 p 值。
我知道我可以 运行 他们像这样:
r1 = mannwhitneyu(s1[0], s2[0])
r2 = mannwhitneyu(s1[1], s2[1])
输出:
MannwhitneyuResult(statistic=39.5, pvalue=0.2239039981060696)
MannwhitneyuResult(statistic=37.0, pvalue=0.17162432050520815)
期望的输出:
array([39.5, 0.2239039981060696], [ 37.0, 0.17162432050520815])
我试过 np.apply_along_axis
但是数组参数只需要一个输入,而我有 2 个。
此外,我需要尽可能快的解决方案,因为我将在模拟过程中对数千个切片执行此操作。
提前致谢!
您可以使用 map(...)
,这是最佳选择,而且比 np.apply_along_axis(...)
快得多,因为它在内部使用 python loop,并且一些计算量大的操作 即 transpose(...)
和 view(...)
,因此在通常情况下,即使使用 python 循环遍历 Numpy 数组也会更快。
import numpy as np
from scipy.stats import mannwhitneyu
s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])
idx = np.arange(len(s1))
def step(i):
return [*mannwhitneyu(s1[i], s2[i])]
np.array(list(map(step, idx)))
给定以下数组:
import numpy as np
from scipy.stats import mannwhitneyu
s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])
我想 运行 对相应样本的每个切片进行一次 Mann-Whitney(-Wilcoxon) U 测试,并将结果填充到一个输出数组中,其中一个切片用于 U 统计量,另一个切片对于 p 值。 我知道我可以 运行 他们像这样:
r1 = mannwhitneyu(s1[0], s2[0])
r2 = mannwhitneyu(s1[1], s2[1])
输出:
MannwhitneyuResult(statistic=39.5, pvalue=0.2239039981060696)
MannwhitneyuResult(statistic=37.0, pvalue=0.17162432050520815)
期望的输出:
array([39.5, 0.2239039981060696], [ 37.0, 0.17162432050520815])
我试过 np.apply_along_axis
但是数组参数只需要一个输入,而我有 2 个。
此外,我需要尽可能快的解决方案,因为我将在模拟过程中对数千个切片执行此操作。
提前致谢!
您可以使用 map(...)
,这是最佳选择,而且比 np.apply_along_axis(...)
快得多,因为它在内部使用 python loop,并且一些计算量大的操作 即 transpose(...)
和 view(...)
,因此在通常情况下,即使使用 python 循环遍历 Numpy 数组也会更快。
import numpy as np
from scipy.stats import mannwhitneyu
s1 = np.array([[1,2,3,4,5,6,7,8,0,10],[10,9,8,7,6,5,4,3,2,1]])
s2 = np.array([[1,11,3,7,5,6,7,8,0,10],[10,9,8,7,6,15,4,13,2,1]])
idx = np.arange(len(s1))
def step(i):
return [*mannwhitneyu(s1[i], s2[i])]
np.array(list(map(step, idx)))