Numpy元素阶矩阵的阶乘

Jav*_*cia 6 python numpy matrix vectorization factorial

我想知道如何逐元素计算矩阵的阶乘。例如,

import numpy as np
mat = np.array([[1,2,3],[2,3,4]])

np.the_function_i_want(mat)
Run Code Online (Sandbox Code Playgroud)

会给一个矩阵mat2,使得mat2[i,j] = mat[i,j]!。我已经尝试过类似

np.fromfunction(lambda i,j: np.math.factorial(mat[i,j]))
Run Code Online (Sandbox Code Playgroud)

但它会将整个矩阵作为参数传递np.math.factorial。我也尝试过使用,scipy.vectorize但是对于大于10x10的矩阵,我得到一个错误。这是我写的代码:

import scipy as sp
javi = sp.fromfunction(lambda i,j: i+j, (15,15))
fact = sp.vectorize(sp.math.factorial)
fact(javi)

OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)

这样的整数将大于2e9,所以我不明白这意味着什么。

Ale*_*ley 6

有一个factorial函数scipy.misc允许对数组进行按元素计算:

>>> from scipy.misc import factorial
>>> factorial(mat)
array([[  1.,   2.,   6.],
       [  2.,   6.,  24.]])
Run Code Online (Sandbox Code Playgroud)

该函数返回一个浮点值数组,因此可以计算“更大”的阶乘,直到浮点数允许的精度为止:

>>> factorial(15)
array(1307674368000.0)
Run Code Online (Sandbox Code Playgroud)

如果要避免以科学计数法显示数字,可能需要调整NumPy数组的打印精度。


关于scipy.vectorize:这OverflowError意味着某些计算的结果太大,无法存储为整数(通常为int32int64)。

如果要向量化sp.math.factorial并需要任意大的整数,则需要指定该函数返回具有'object'数据类型的输出数组。例如:

fact = sp.vectorize(sp.math.factorial, otypes='O')
Run Code Online (Sandbox Code Playgroud)

指定'object'类型允许Python整数由返回fact。它们的大小不受限制,因此您可以计算出计算机内存允许的最大因子。请注意,这种类型的阵列会失去常规NumPy阵列所具有的一些速度和效率优势。

  • 对于 scipy >= 1.0.0 来自 `scipy.misc` 的 `factorial` 已被弃用。必须使用 `scipy.special.factorial` 代替。 (5认同)