2016-10-31 3 views
0

私はコーディングの新人です。私はBokehと協力しようとしています。私はここで何か間違っていたかどうか教えてください。np.linspace vs Bokehの範囲

私はthis exampleとBokehのウェブサイトで遊んでいますが、問題が発生しました。この例のようにx値が設定されている場合、np.linspaceを使用して、対話を使用して更新機能で再生できます。しかし、xをリストに変更してrange()を使用すると、次のエラーが表示されます。TypeError:リストに連結できるのはリストだけです( "float"ではなく)。私が理解しているように、問題は「x +φ」にあります.xはリストであり、φは浮動小数点ですからです。

リストをfloatで連結することはできませんが、numpy.ndarrayを使用してPythonがy値を制御する関数を変更したいと理解しているのはなぜですか? https://docs.python.org/3.6/tutorial/datastructures.html

あなたはまた、次のコードで遊ぶことができます:

x = np.linspace(0,10,1000) 
y = np.sin(x) 
p = figure(title="example", plot_height=300, plot_width=600, y_range=(-5,5)) 
r = p.line(x, y) 

def update(f, w=1, A=1, phi=0): 
    if f == "sin": func = np.sin 
    elif f == "cos": func = np.cos 
    elif f == "tan": func = np.tan 
    r.data_source.data["y"] = A * func(w * x + phi) 
    push_notebook() 

show(p, notebook_handle=True) 
interact(update, f=["sin", "cos", "tan"], w=(0,100), A=(1,5), phi=(0,20, 0.1)) 
+1

'+ '演算子とはまったく異なる意味を割り当てます。彼らは非常に異なるタイプであり、あなたは決して他と同じように動作すると仮定してはいけません。 – user2357112

+0

'x = np.arange(0,10、.01)'を使うことができます。これは 'range'のようなパラメータを持ちますが、' numpy'配列を生成します。 – hpaulj

+0

'+'演算子は、numpy配列に対して加算を行いますが、リストに対しては加算を行います。 'np.array([1])+ np.array([1])== np.array([2])'ではなく、 '[1] + [1] == [1、1]'です。 @hpauljが述べたように、 'range'の代わりに' np.arange'を使用すると、リストではなく配列の出力が得られます。 –

答えて

0

はい、リストのドキュメントを使用してnumpyのドキュメントを比較してください:ここでは

は(私はJupyterノートブックを使用しています)のコードです:

from numpy import linspace 

a = linspace(2, 3, num=5) 
b = range(5) 

print(type(a), a) 
print(type(b), b) 
print() 
print("array + array:", a + a) 
print("list + list:", b + b) 
print(a + 3.14159) 
print(b + 2.718) # will fail as in your example, because it is a list 

他の理由がない場合は、リストと配列を混在させないことをお勧めします。私は個人的には、必要に応じて関数の引数を配列にキャストすることがよくあります:

def f(an_array): 
    an_array = numpy.array(an_array) 
    # continue knowing that it is an array now, 
    # being aware that I make a copy of an_array at this point