加速scipy函数的python包装器

2024-09-25 08:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要为scipy.stats函数创建一个简单包装器的快速python实现。此函数只接受向量,不接受矩阵。下面的包装器是两个实现,但都有相似的运行时间。 在不将实现转移到C/C++域的情况下,是否有可能加快其中的任何一个

import numpy as np
from scipy.stats import kendalltau

def wrap1(X, y):
    corr = []
    p_value = []
    X = np.array(X).transpose()
    y = np.ravel(y)
    for col in X:
        ktau = kendalltau(col, y, nan_policy='raise')
        corr.append(ktau[0])
        p_value.append(ktau[1])
    return corr, p_value

##########Version2

def wrap2(X, y):
        X = np.array(X).transpose()
        y = np.tile(np.ravel(y), (X.shape[0], 1))
        corr, p_value = zip(*[kendalltau(a, b, nan_policy='raise')
                              for a, b in zip(X, y)])
        return corr, p_value

样本运行:

t1 = np.arange(30).reshape(10,3)
t2 = np.arange(10).reshape(10,)
wrap1(t1,t2)
wrap2(t1,t2)

非常感谢


Tags: 函数importvaluedefstatsnpscipyarray
1条回答
网友
1楼 · 发布于 2024-09-25 08:40:08

1)在wrap1函数中,预先分配corr和p_值的数组,并填充它们,而不是附加到列表中

2)将np.array(X)替换为np.asarray(X)-如果X已经是一个数组,则可以避免复制它

如果停留在python级别,这可能就是您可以轻松完成的全部工作

如果这还不够,您可以尝试分析kendalltau函数。有相当多的事情正在进行,如果您看到在检查数组中的nan值等方面花费了相当大的一部分时间,并且您确信您的输入没有这些值,那么您可以将scipy实现的相关部分复制粘贴到您的代码中

相关问题 更多 >