在numpy和scipy中的因子

MOO*_*OON 42 python numpy scipy

如何从numpy和scipy中分别导入阶乘函数,以便查看哪一个更快?

我已经通过导入数学从python本身导入了factorial.但是,它不适用于numpy和scipy.

Ash*_*ary 54

您可以像这样导入它们:

In [7]: import scipy, numpy, math                                                          

In [8]: scipy.math.factorial, numpy.math.factorial, math.factorial
Out[8]: 
(<function math.factorial>,                                                                
 <function math.factorial>,                                                                
 <function math.factorial>)
Run Code Online (Sandbox Code Playgroud)

scipy.math.factorialnumpy.math.factorial似乎仅仅是为/别名/引用math.factorial,那就是scipy.math.factorial is math.factorialnumpy.math.factorial is math.factorial都应该给True.


Yux*_*ang 41

对于阿什维尼答案是伟大的,在指出scipy.math.factorial,numpy.math.factorial,math.factorial有相同的功能.但是,我建议使用Janne提到的那个,这scipy.misc.factorial是不同的.scipy中的那个可以np.ndarray作为输入,而其他人则不能.

In [12]: import scipy.misc

In [13]: temp = np.arange(10) # temp is an np.ndarray

In [14]: math.factorial(temp) # This won't work
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-039ec0734458> in <module>()
----> 1 math.factorial(temp)

TypeError: only length-1 arrays can be converted to Python scalars

In [15]: scipy.misc.factorial(temp) # This works!
Out[15]: 
array([  1.00000000e+00,   1.00000000e+00,   2.00000000e+00,
         6.00000000e+00,   2.40000000e+01,   1.20000000e+02,
         7.20000000e+02,   5.04000000e+03,   4.03200000e+04,
         3.62880000e+05])
Run Code Online (Sandbox Code Playgroud)

所以,如果你对np.ndarray进行阶乘,那么来自scipy的那个将更容易编码并且比执行for循环更快.

  • 弃用警告:在scipy 1.0.0中.使用`scipy.special.factorial` (9认同)
  • 关于`scipy.misc.factorial`的好处是它只计算一次阶乘 - 对于数组中最大的数.所有其他计算都是过程中的副作用. (8认同)
  • 如果需要,“scipy.special.factorial”还可以使用 gamma 函数估计值。 (3认同)

Jan*_*ila 21

SciPy有这个功能scipy.special.factorial(以前scipy.misc.factorial)

>>> import math
>>> import scipy.special
>>> math.factorial(6)
720
>>> scipy.special.factorial(6)
array(720.0)
Run Code Online (Sandbox Code Playgroud)


Ste*_*ald 5

    from numpy import prod

    def factorial(n):
        print prod(range(1,n+1))
Run Code Online (Sandbox Code Playgroud)

或来自运营商的mul:

    from operator import mul

    def factorial(n):
        print reduce(mul,range(1,n+1))
Run Code Online (Sandbox Code Playgroud)

或完全没有帮助:

    def factorial(n):
        print reduce((lambda x,y: x*y),range(1,n+1))
Run Code Online (Sandbox Code Playgroud)