我想知道如何计算矩阵元素的阶乘。例如,
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,所以我不明白这意味着什么。
答案 0 :(得分:4)
scipy.misc
中有一个factorial
函数,它允许对数组进行逐元素计算:
>>> from scipy.misc import factorial
>>> factorial(mat)
array([[ 1., 2., 6.],
[ 2., 6., 24.]])
该函数返回一个浮点值数组,因此可以计算“更大”的阶乘,直到浮点数允许的精度:
>>> factorial(15)
array(1307674368000.0)
如果您想避免以科学计数法显示数字,可能需要调整NumPy数组的打印精度。
关于scipy.vectorize
:OverflowError
意味着某些计算的结果太大而无法存储为整数(通常为int32
或int64
)。
如果要向量化sp.math.factorial
并想要任意大整数,则需要指定该函数返回具有'object'
数据类型的输出数组。例如:
fact = sp.vectorize(sp.math.factorial, otypes='O')
指定'object'
类型允许fact
返回Python整数。它们的大小不受限制,因此您可以计算与计算机内存允许的一样大的因子。请注意,此类阵列会失去常规NumPy阵列所具有的一些速度和效率优势。