2

Python で次の Matlab コードを実装したいと考えています。

x=1:100;
y=20*log10(x);

これを行うためにNumpyを使用してみました:

y = numpy.zeros(x.shape)
for i in range(len(x)):
    y[i] = 20*math.log10(x[i])

しかし、これは for ループを使用します。Matlabのようにベクトル化された操作を行う方法はありますか? 除算や乗算などの簡単な数学については、それが可能であることを知っています。しかし、ここでの対数のような他のより洗練された演算はどうでしょうか?

4

6 に答える 6

3
y = numpy.log10(numpy.arange(1, 101)) * 20

In [30]: numpy.arange(1, 10)
Out[30]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

In [31]: numpy.log10(numpy.arange(1, 10))
Out[31]:
array([ 0.        ,  0.30103   ,  0.47712125,  0.60205999,  0.69897   ,
        0.77815125,  0.84509804,  0.90308999,  0.95424251])

In [32]: numpy.log10(numpy.arange(1, 10)) * 20
Out[32]:
array([  0.        ,   6.02059991,   9.54242509,  12.04119983,
        13.97940009,  15.56302501,  16.9019608 ,  18.06179974,  19.08485019])
于 2013-04-02T21:28:16.910 に答える
3

うん、確かにある。

x = numpy.arange(1, 100)
y = 20 * numpy.log10(x)
于 2013-04-02T21:29:07.780 に答える
2

Numpy のドキュメントを参照してください。これは開始するのに適した場所です。

http://docs.scipy.org/doc/numpy/reference/routines.html

そして、特にあなたの質問に関連しています:

http://docs.scipy.org/doc/numpy/reference/routines.math.html

于 2013-04-02T21:32:35.853 に答える
2

Numpyには、 log10 などの組み込みの配列演算子が多数あります。numpy のドキュメントにリストされておらず、組み込みメソッドを組み合わせて生成できない場合、効率的に行う簡単な方法はありません。C レベルの関数を実装して numpy 配列を操作し、それをコンパイルすることはできますが、これは 1 行または 2 行の Python コードよりもはるかに手間がかかります。

あなたの場合、ほとんど正しい出力がすでにあります:

y = 20*numpy.log10(x)
于 2013-04-02T21:31:44.850 に答える
1

numpy 標準のベクトル化関数を使用してベクトル化操作を実行する以外に、 numpy.vectorizeを使用してカスタムのベクトル化関数を作成することもできます 。以下に一例を示します。

    >>> def myfunc(a, b):
    ...     "Return a-b if a>b, otherwise return a+b"
    ...     if a > b:
    ...         return a - b
    ...     else:
    ...         return a + b
    >>>
    >>> vfunc = np.vectorize(myfunc)
    >>> vfunc([1, 2, 3, 4], 2)
    array([3, 4, 1, 2])
于 2015-07-02T08:33:08.140 に答える