如何对数组进行多进程处理?

12

我有:

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数组来保存这些数字?

2个回答

16

将数组乘以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)

非常感谢。我正要放弃并使用缓慢的循环!您提到这是一段时间以前唯一的选择,现在有哪些其他选择? - Rapid
4
一个快速的谷歌搜索似乎表明这仍然是唯一的选择。这很容易理解,因为这个选项非常简单。 - jorgeca
我在其他环境中遇到了相同的问题,我刚刚将我的帖子链接到了这个页面。感激任何帮助。 - Ash
那么,当我需要将一个np.array乘以某个mpf数字时,先将np.array转换为mpf然后再与mpf数字相乘是没有意义的吗?直接进行乘法运算会得到相同的结果(相同的精度)吗? - Kvothe

3

请查看mpmath.arange

import numpy as np
import mpmath as mp

np.array(mp.arange(600))

我仍然无法执行A=np.array(arange(600)),然后执行besseli(0,A)而不会出现错误? - Rapid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接