0

次のようにPythonで関数を作成しました。

from bisect import basect_left
    def find(i):
        a=[1,2,3]
        return bisect_left(a,i);

この関数が反復を入力として受け入れ、反復を出力として生成するようにしたいと考えています。特に、私は numpy を使用しており、linspace を入力として使用して、このコードの出力を取得できるようにしたいと考えています。

import matplotlib.pyplot as plt
t=scipy.linspace(0,10,100)
plt.plot(t,find(t))

更新!!!:私が得るエラーは次のとおりです。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

ライブラリbisect_leftから提供されます。bisectどうすればこの問題を解決できますか? ありがとうございました。

4

2 に答える 2

1

あなたのコードは実際にはそのまま動作しますが、私はいくつかのコメントをします:

def sqr(i):
  return i*i;                      # you don't need the ";" here 

import matplotlib.pyplot as plt
import scipy                       # you should use "import numpy as np" here
t=scipy.linspace(0,10,100)         # this would be "np.linspace(...)" than
plt.plot(t,sqr(t))                

simple_figure.png

呼び出しscipy.linspace(0,10,100)で、ベクトル化された計算のサポートが組み込まれているnumpy配列(scipyはnumpyからlinspaceをインポートします)を作成しています。Numpyは、より複雑な計算が必要な場合にインデックス付けufuncsと一緒に使用できるベクトル化されたものを提供します。Matplolibは、numpy配列を入力として受け入れ、配列内の値をプロットします。

ipythonインタラクティブコンソールとして使用する例を次に示します。

In [27]: ar = np.arange(10)

In [28]: ar
Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [29]: ar * ar
Out[29]: array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

In [30]: np.sin(ar)
Out[30]: 
array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
       -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])
In [31]: ar.mean()
Out[31]: 4.5

In [32]: ar[ar > 5] 
Out[32]: array([6, 7, 8, 9])

In [33]: ar[(ar > 2) & (ar < 8)].min()
Out[33]: 3
于 2013-03-14T06:43:41.213 に答える
0

ジェネレーター式plt.plot(t, (sqr(x) for x in t))
EDITを使用できます: 関数に入れることもできます:

def sqr(t):
    return (i*i for i in t);

または、yield ステートメントを使用してジェネレーターを作成することもできます。

def sqr(t):
   for i in t:
      yield i*i
于 2013-03-14T04:32:52.233 に答える