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)

dtype=object標準の dtypes を使用した操作を超高速にする強力な numpy 機構は、デフォルト オブジェクトの python 演算子によって処理されるため、numpy 配列を使用すると誤解を招く可能性があります。これは、速度がもはや存在しないことを意味します。

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

これは 2 つのライブラリのいずれかのバグだと思います。また、修正されていると思います。

入力:

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__) で除算する方法を指定していませんでした。

要素を上書きする場合を除き、dtypeのを指定する必要はありません。ndarray乗算のような演算は newndarrayになり、Numpy は何dtypeを使用するかを判断します。

于 2015-07-04T00:35:02.323 に答える