2017-04-07 8 views
2

私はリーマンシータ機能をモデル化しています:numpyで負のパワーにすることができないのはなぜですか?

import numpy as np 
def theta(s, n=100): 
    a_range = np.arange(2, n + 1) 
    return 1 + sum(1/(a_range ** s)) 

それは負sのために動作しません。例えばtheta(-2)はこのエラーにつながります。

 1 def theta(s, n=100): 
     2  a_range = np.arange(1) 
----> 3  return 1 + sum(1/(a_range ** s)) 
     4 
     5 theta(-2) 

     ValueError: Integers to negative integer powers are not allowed. 

なぜですか? x^-1はちょうど1/xでなければなりません。

+3

を:「負の整数のべき乗の整数が許可されていません。 "、なぜ試してみませんか:' a_range = np.arange(2、n + 1、dtype = np.float) '? – Evert

+0

または単に 'a_range = np.arange(1.0)'で十分です。 –

+0

それだけです!ありがとう。 – shredding

答えて

6

NumPyでは、a_range ** sのような操作の出力dtypeは、値ではなく入力dtypesによって完全に決定されます。これは整数を整数にすることは常に整数を与えなければならない、あるいは常に浮動小数点を与えなければならないことを意味します。

numpy.array([2]) ** numpy.array([2])のようなものは整数出力を与えることが重要です。つまり、numpy.array([2]) ** numpy.array([-2])は整数または何も与えなければなりません。彼らは何も選びませんでした。整数を負の整数にすることは、NumPyのエラーです。

あなたは浮動小数点出力をしたい場合は、浮動小数点入力します:エラーメッセージが明示的に述べて、以来

a_range = np.arange(2, n + 1, dtype=float) 

または

a_range = np.arange(2, n + 1).astype(float) 
関連する問題