まず、あなたのコードでarray
は、実際には numpy 配列ではないことに注意してください。これは通常の Pythonlist
の文字列です。Anmol_uppal の回答のように、文字列を分割して要素を整数に変換することで、このリストを操作することは可能ですが、csv ファイルの内容を nrows x 6 numpy 配列に直接変換する方がはるかに簡単ですnp.loadtxt
。
import numpy as np
data = np.loadtxt('rand1.csv', delimiter=',', dtype=np.int)
print(repr(data[0]))
# array([ 2, 6, 76, 45, 78, 1])
を呼び出すoptimize.newton
と、パラメーターは 6 つのパラメーター値のシーケンスargs=
を取得する必要があります。各行に6 つの数値ではなく単一の文字列が含まれていたため、元のコードは機能していませんでした。* がnrows x 6 の配列になったので、各行には 6 つの数値が含まれるため、次のようにするだけです。array
data
res = [optimize.newton(func, 5102, args=row) for row in data]
*クラスとの混乱array
をdata
避けるために、変数の名前を に変更したことに注意してくださいnp.array
アップデート
元のコードに、最初は気付かなかった別のエラーがありました。のドキュメントをご覧くださいscipy.optimize.newton
。
func : 関数
ゼロが必要な関数。これは、f(x,a,b,c...) の形式の単一変数の関数である必要があります。ここで、a、b、c... は、args パラメーターで渡すことができる追加の引数です。
x0 : フロート
実際のゼロに近いゼロの初期推定値。
次に、関数定義を見てください。
def func(a,b,c,d,e,f):
return a*b*c-d*e-f
(あなたが呼び出した)への最初の引数はxパラメータに対応している必要があります。その後、 を使用して渡す必要がある追加の引数は(定義に従って)5つだけです。電話をかけようとするとfunc()
a
b ... f
args=
optimize.newton(func, 5102, args=(422, 858, 129, 312, 79, 371))
5102 がパラメータとして解釈さx0
れ、最初の引数として に渡されますfunc()
。タプルの6 つの値はargs=
追加の引数として扱われるため、関数は実際には合計7 つの引数を取得します。
func(5102, 422, 858, 129, 312, 79, 371)
明らかに、func()
は 6 つの引数を取るように定義されているため、エラーが発生します。これを修正する正しい方法は、関数のパラメーターをどのように解釈するかによって異なります。の目標は、f(x, a, b, c, ...) = 0 となるxnewton
の値を見つけることです。
6 つのパラメータのうちどれを最小化したいfunc()
ですか?
完全な説明
args=data[0]
もう少し興味深い質問は、追加の引数をタプルではなく配列 (例: ) として渡すと、なぜエラーが発生しないのかということです。答えはもう少し複雑ですが、興味がある場合は読み進めてください。
ソースコードをscipy.optimize.newton
見ると、関数が初めて呼び出される行を見つけることができます:
q0 = func(*((p0,) + args))
この場合、 p0
andは へp1
のx0
引数となりnewton()
、 andargs
は追加の引数のセットです。
q0 = func(*((5102,) + (422, 858, 129, 312, 79, 371)))
(p0,)
がタプルで、args
もタプルである場合、+
演算子はこれら 2 つのタプルを結合します。
q0 = func(*(5102, 422, 858, 129, 312, 79, 371))
最後に、*
はタプルをアンパックして引数を に渡しますfunc
。最終的な呼び出しは次のようになります。
q0 = func(5102, 422, 858, 129, 312, 79, 371)
引数が 6 つの関数には引数が 7 つあるため、これはエラーになります。ただし、次の場合args
は次のnp.array
とおりです。
q0 = func(*(5102,) + array([422, 858, 129, 312, 79, 371]))
の各要素に値+
を追加します。p0
args
q0 = func(*(5524, 5960, 5231, 5414, 5181, 5473))
6 つの引数しかないのでfunc()
、呼び出しは成功しますがnewton
、間違った答えに収束します!
これはscipyでは特に良い設計ではないと思います.他のほとんどの場合、リスト、タプル、配列などを含む配列のような入力でうまくいくので、私を捕まえました.公平を期すために、newton
それargs=
はタプルですが、安全のために型チェックを行うか、明示的にタプルにキャストします。私はscipyでこの問題を修正しようとするかもしれません。