使用Numpy的元素矩阵的因子

时间:2015-06-16 22:03:53

标签: python numpy matrix vectorization factorial

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

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,所以我不明白这意味着什么。

1 个答案:

答案 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.vectorizeOverflowError意味着某些计算的结果太大而无法存储为整数(通常为int32int64)。

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

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

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