4

我想要一个带有 mpz/mpfr 值的 numpy 数组。因为我的代码:

import numpy as np
import gmpy2
A=np.ones((5,5));
print A/gmpy2.mpfr(1);

生成:

RuntimeWarning: invalid value encountered in divide
  print A/gmpy2.mpfr(1);
[[1.0 1.0 1.0 1.0 1.0]
 [1.0 1.0 1.0 1.0 1.0]
 [1.0 1.0 1.0 1.0 1.0]
 [1.0 1.0 1.0 1.0 1.0]
 [1.0 1.0 1.0 1.0 1.0]]

据我所知,不可能将 gmpy mpfr 转换为 numpy float64。那么我怎样才能首先获得一个带有 mpfr 值的 numpy 数组呢?

谢谢。

4

2 回答 2

7

您需要使用 来创建数组dtype=object,然后您可以在数组中使用任何 python 类型。我没有安装 gmpy2,但下面的例子应该显示它是如何工作的:

In [3]: a = np.ones((5, 5), dtype=object)

In [5]: import fractions

In [6]: a *= fractions.Fraction(3, 4)

In [7]: a
Out[7]: 
array([[3/4, 3/4, 3/4, 3/4, 3/4],
       [3/4, 3/4, 3/4, 3/4, 3/4],
       [3/4, 3/4, 3/4, 3/4, 3/4],
       [3/4, 3/4, 3/4, 3/4, 3/4],
       [3/4, 3/4, 3/4, 3/4, 3/4]], dtype=object)

拥有一个 numpy 数组dtype=object可能会产生误导,因为强大的 numpy 机制使标准 dtypes 的操作变得超级快,现在由默认对象的 python 运算符处理,这意味着速度将不再存在:

In [12]: b = np.ones((5, 5)) * 0.75

In [13]: %timeit np.sum(a)
1000 loops, best of 3: 1.25 ms per loop

In [14]: %timeit np.sum(b)
10000 loops, best of 3: 23.9 us per loop
于 2013-03-09T05:55:49.203 回答
1

我相信这是两个库之一中的错误。我也相信它是固定的。

输入:

import sys
import numpy as np
import gmpy2

print(sys.version)
print(np.__version__)
print(gmpy2.version)

A=np.ones((5,5));
print(A/gmpy2.mpfr(1))

输出:

3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)]
1.9.1
2.0.5
[[mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0')]
 [mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0') mpfr('1.0')]]

Numpy 没有正确说明遇到未知类型时该怎么做,或者 gmpy2 没有指定如何除以某物(__rdiv__)。

除非您打算覆盖其元素,否则不必指定dtypean 的。ndarray像乘法这样的操作会产生一个新ndarray的 ,Numpy 会弄清楚dtype要使用什么。

于 2015-07-04T00:35:02.323 回答