【问题标题】:How to mpf an array?如何mpf数组?
【发布时间】:2014-06-24 04:27:24
【问题描述】:

我有:

import numpy as np
from mpmath import *

mpf(np.array(range(0,600)))

但它不会让我这样做:

TypeError: cannot create mpf from array

那我该怎么办?

基本上我将使用这个数组,并根据情况(例如1.35626567e10846.2345252e-2732)将元素乘以令人难以置信的大或令人难以置信的小数,因此需要 mpf。

更具体地说,我将使用 besseli 和 besselk 函数来创建令人难以置信的大值和令人难以置信的小值。

如何获得一个 mpf 数组来保存这些数字?

【问题讨论】:

    标签: python arrays numpy mpf mpmath


    【解决方案1】:

    将一个数组乘以一个 mpf 数字就可以了:

    import numpy as np
    import mpmath as mp
    small_number = mp.besseli(400, 2)  # This is an mpf number
    # Note that creating a list using `range` and then converting it
    # to an array is not very efficient. Do this instead:
    A = np.arange(600)
    result = small_number * A  # Array of dtype object, ie, it contains mpf numbeers
    

    将两个包含 mpf 数字的数组按元素相乘也可以:

    result * result
    

    所以你真正的问题是如何评估一个 numpy 数组中的 mpmath 函数。为此,我会使用np.frompyfunc(前段时间这是唯一的选择)。

    besseli_vec = np.frompyfunc(mp.besseli, 2, 1)
    besseli_vec(0, A)
    

    【讨论】:

    • 非常感谢。我正要放弃并使用缓慢的 for 循环!您提到前一段时间这是唯一的选择,现在还有哪些其他选择?
    • @Rapid 快速的谷歌搜索似乎暗示它仍然是唯一的方法。这是可以理解的,因为这个选项非常简单。
    • 我在不同的环境中遇到了同样的问题,我只是将我的帖子链接到此页面。非常感谢任何帮助,
    • 因此,当我必须将一个 np.array 乘以某个 mpf 数时,首先将 np.array 转换为 mpf,然后将其与 mpf 数相乘是没有意义的?结果将与直接执行乘法相同(相同的精度)?
    【解决方案2】:

    查看mpmath.arange

    import numpy as np
    import mpmath as mp
    
    np.array(mp.arange(600))
    

    【讨论】:

    • 我仍然不能这样做A=np.array(arange(600)),然后是besseli(0,A),否则会向我抛出错误?