0

私はPythonを試して学び始めたばかりです。関数のプロットに問題があります。私はウェブの例に従っていますが、うまくいくようです。ただし、自分のもので試してみると、関数が長さ1の配列しかスカラーとして使用できないというエラーが表示されますが、自分の試みとプロットの例をコピーすることの違いはわかりません。私のコードは次のとおりです。

i = np.arange(-16, -7, 1)
r = []
y = []
for x in i:
    r.append(math.pow(10, x))

x = np.asarray(r)
y = (math.cos(1.2) - (1 / x) * (math.sin(1.2 + x) - math.sin(1.2)))
plot(x,y)
show()

y=f(x)基本的に、値を出力したいだけです10^-16, 10^-15...10^-7。しかし、私が見つけたすべてのプロット例は、同じ方法で実装していることを誓います。たとえば、これは問題なく機能します。

x = arange(0, 2, 0.01)
y = 2 * sin(2 * pi * (x - 1 / 4))
plot(x, y)
4

2 に答える 2

1

正しいモジュールで関数を使用していますか? Python のビルトインmath.cosは単一のスカラー値のみを受け取りますが、numpy.cos配列も受け取ります。

>>> import numpy
>>> import math
>>> math.cos([1, 2, 3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> numpy.cos([1, 2, 3])
array([ 0.54030231, -0.41614684, -0.9899925 ])
于 2012-09-14T16:11:52.333 に答える
0

あなたの主な問題は、2 種類の数学演算を混在させていることです。

  • mathモジュールからの操作。
  • (NumPy 配列)で動作するNumPyからの操作。ndarraysそれは多かれ少なかれ慣習的import numpy as npです。

モジュールの関数は、mathfloatスカラーのみで機能します。スカラーのセット (リスト、配列など) で関数を使用する場合mathは、セットのすべての項目に繰り返し適用する必要があります。それが、リストを作成するときに現在行っていることです。rループは次のように変換できます。r = [math.pow(10,x) for x in i]

反対に、NumPy は大きなデータ配列を処理するために設計されています。配列に対する操作は、C レベルで直接実行されます。これは、説明した iteratve メソッドよりもはるかに高速で効率的です。関数を使用する場合、入力セットはボンネットnpの下で変換されます。ndarray

たとえば、次の関数rを使用して配列を非常に効率的に作成できます。np.power

r = np.power(10., i)

(出力配列に float を強制的に10.持たないように andを使用していることに注意してください。同様に行うこともできました)。10dtypenp.power(10, i, dtype=float)

あなたは次のyようになります。

y = (math.cos(1.2) - (1. / r) * (np.sin(1.2 + r) - math.sin(1.2)))

mathのサインとコサインを計算し続けても問題あり1.2ません。これはスカラーに過ぎないからです。しかし、そのsin(1.2 + x)部分についてxは、すでにであるためndarray、 を使用する必要がありますnp.sin。別の方法として、 を反復して のxような配列を作成することもできますが、そもそもnp.array([math.sin(i+1.2) for i in x])使用する点が完全に無効になります。ndarrays

あなたが言及した最後の例では、ステップがありません:

from numpy import sin

sinこれは NumPy 関数であり、対応するものではないことを覚えておく必要がありmathます。混乱のリスクがあるため、おそらく関数を個別にインポートしてnp.sin代わりに使用するべきではありません。

于 2012-09-15T13:38:16.830 に答える