使用 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.vectorize
:OverflowError
意味着某些计算的结果太大而无法存储为整数(通常为int32
或int64
)。
如果要向量化 sp.math.factorial
并需要任意大的整数,则需要指定函数 return 是数据类型为 'object'
的输出数组。例如:
fact = sp.vectorize(sp.math.factorial, otypes='O')
指定 'object'
类型允许 Python 整数被 fact
编辑 return。它们的大小没有限制,因此您可以在计算机内存允许的范围内计算阶乘。请注意,这种类型的数组失去了常规 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.vectorize
:OverflowError
意味着某些计算的结果太大而无法存储为整数(通常为int32
或int64
)。
如果要向量化 sp.math.factorial
并需要任意大的整数,则需要指定函数 return 是数据类型为 'object'
的输出数组。例如:
fact = sp.vectorize(sp.math.factorial, otypes='O')
指定 'object'
类型允许 Python 整数被 fact
编辑 return。它们的大小没有限制,因此您可以在计算机内存允许的范围内计算阶乘。请注意,这种类型的数组失去了常规 NumPy 数组所具有的一些速度和效率优势。