C# Nmath 转 Python SciPy

1 投票
4 回答
1242 浏览
提问于 2025-04-15 11:18

我需要把一些功能从C#转到Python,但我无法正确实现下面的代码:

[SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
public static SqlDouble LogNormDist(double probability, double mean, double stddev)
{
    LognormalDistribution lnd = new LognormalDistribution(mean,stddev);
    return (SqlDouble)lnd.CDF(probability);
}

这段代码使用了CenterSpace Nmath库。

有没有人能帮我写一个在Python中类似的函数呢?

抱歉我的英语不好。

更新 其实,我不太明白scipy.stats.lognorm.cdf中的哪些属性和C#中的概率、均值、标准差是相似的。

如果直接把现有的顺序复制到Python中,就像下面的回答那样,我得到的结果是错误的。

4 个回答

0

也许你可以试试 Python.NET(这不是 IronPython),它可以让你访问 .NET 的组件和服务:

http://pythonnet.sourceforge.net/

2

Python的文档里介绍了一种方法叫做 random.lognormvariate(mu, sigma):

http://docs.python.org/library/random.html

也许这正是你需要的。

4

Scipy里面有很多种分布是定义在scipy.stats这个包里的。

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,mean)

更新

好吧,看起来Scipy的统计定义有点不太标准。这里是scipy.stats.lognormal的文档结尾部分:

对数正态分布

lognorm.pdf(x,s) = 1/(sxsqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 适用于 x > 0, s > 0。

如果log x是正态分布,平均值为mu,方差为sigma的平方, 那么x就是对数正态分布,形状参数为sigma,尺度参数为exp(mu)。

所以可以试试这个:

return scipy.stats.lognorm.cdf(prob,stddev,scipy.exp(mean))

如果还是不行,试着获取几个样本点,我看看能不能找到一个有效的关系。

更新 2

哎呀,我没意识到尺度参数是一个关键字。这个应该可以工作:

import scipy.stats

def LogNormDist(prob, mean=0, stddev=1):
    return scipy.stats.lognorm.cdf(prob,stddev,scale=scipy.exp(mean))

祝你好运,项目顺利!

撰写回答