使用 Numpy 逐元素矩阵的阶乘

Factorial of a matrix elementwise with Numpy

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

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

np.the_function_i_want(mat)

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

np.fromfunction(lambda i,j: np.math.factorial(mat[i,j]))

但它传递了整个矩阵作为 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

这样的整数会大于2e9,所以我不明白这是什么意思。

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

>>> from scipy.misc import factorial
>>> factorial(mat)
array([[  1.,   2.,   6.],
       [  2.,   6.,  24.]])

函数 return 是一个浮点值数组,因此可以计算 "larger" 阶乘,最高可达浮点数允许的精度:

>>> factorial(15)
array(1307674368000.0)

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


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

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

fact = sp.vectorize(sp.math.factorial, otypes='O')

指定 'object' 类型允许 Python 整数被 fact 编辑 return。它们的大小没有限制,因此您可以在计算机内存允许的范围内计算阶乘。请注意,这种类型的数组失去了常规 NumPy 数组所具有的一些速度和效率优势。