2016-07-08 17 views
3

タイトルが示唆するように、私は区分的な関数でカーブフィットを試みています。次に例を示します。区分的関数による曲線フィット?

import numpy as np 
import scipy.optimize as sio 

x = np.array([0, 1, 2, 3, 4, 5]) 
y = np.array([2, 3, 4, 11, 18, 27]) 

def f(x, a): 
    if x <= 2: 
     return x + a 
    elif x >= 3: 
     return x**2 + a 

sio.curve_fit(f, x, y) 

さて、これは次のエラーを返す:印刷機能を追加することにより

ValueError: The truth value of an array with more than one element is ambiguous 

を、私は「X」の値が関数に渡されたためであると考え出し'f'は数値配列です[0, 1, 2, 3, 4, 5]

この問題を回避する方法があるのでしょうか。

ありがとうございます!

+3

問題は、0 [ '場合は、求めていることがより具体的です1、2、3、4、5] <2」であることは真である。 numpyがこれを解釈する方法は配列 '[True、True、False、False、False]を返すことです。 Pythonはこれに対処する方法を知らない。私はあなたのコードがあなたがしたいこととは異なる何かをしていると思います。 f(x、a)に何をしたいですか? –

+0

fの目的は、配列の各要素を調べることです。したがって、tom10が示唆したことは、配列を調べて各要素にfを適用することです。 – Zhaitan

答えて

1

これはあなたがNPを使用することができ、問題の一種であります。boolean配列を利用することができます。データの配列が大きい場合は、配列をループするよりもはるかに効率的で、任意の式をif/else条件として使用できます。 numpyの式で使用することができる

import numpy as np 
import scipy.optimize as sio 

x = np.array([0, 1, 2, 3, 4, 5]) 
y = np.array([2, 3, 4, 11, 18, 27]) 

def f(x, a): 
    y = np.zeros(len(x)) 
    y += (x + a) * (x <= 2) 
    y += (x ** 2 + a) * (x >= 3) 
    return y 

sio.curve_fit(f, x, y) 

ここで、x < = 2 =

[True, True, True, False, False, False] 

[1, 1, 1, 0, 0, 0] 
1

全体的な問題は、スカラーの場合はfと書かれていますが、xaはnumpyの配列です。これはif行とreturnifステートメントの両方の場合に該当します。

あなたのコードに最も類似した解決策を行うには、次のようになります。

import numpy as np 
import scipy.optimize as sio 

x = np.array([0, 1, 2, 3, 4, 5]) 
y = np.array([2, 3, 4, 11, 18, 27]) 

def f(x, a): 
    y = np.zeros(len(x)) 
    for i, xi in enumerate(x): 
     if xi <= 2: 
      y[i] = xi + a 
     elif xi >= 3: 
      y[i] = xi**2 + a 
    return y 

sio.curve_fit(f, x, y) 

fのより多くのベクトル化の定義は次のようになります。

def f(x, a): 
    y = np.zeros(len(x)) 
    y[:3] += a 
    y[3:] = x[3:]**2 + a 
    return y 
+0

ありがとう、ありがとう。あなたの最初の解決策としては、yを配列に追加するのではなく、毎回異なる値に設定しているように見えますが、私はその考えを得ています。 – Zhaitan

+0

はい、間違いでした。ありがとう。今修正されました。 (全体的には、私は 'curve_fit'の中でそれがすべて意味をなさないことを確かめるためにこれをテストしていませんでしたが、私はちょうど基本的な問題といくつかの可能な解決策を概説したいと思いました。あなたの直ぐ質問。) – tom10

関連する問題