gpt4 book ai didi

python - 使用 Numpy 逐元素矩阵的阶乘

转载 作者:太空狗 更新时间:2023-10-30 02:59:48 29 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

>>> factorial(15)
array(1307674368000.0)

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


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

如果你想对 sp.math.factorial 进行矢量化并想要任意大的整数,你需要指定该函数返回一个输出数组,其中包含 'object' 数据类型。例如:

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

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

关于python - 使用 Numpy 逐元素矩阵的阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879063/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com