1

2 つのスカラー パラメーターと 1 つの array_like パラメーターを受け入れる Python 関数 f() があるとします。

def f(a, b, arr):
    X = a * np.exp(-arr**2 / b)
    return np.sum(a * np.log(X) - arr)

私がやりたいことは、同じ arr を維持しながら、a と b の異なる値に対して f() を評価することです。

XX, YY = np.meshgrid(A_axis, B_axis)
arr = np.arange(10)
ZZ = np.empty_like(XX)
for i in range(XX.shape[0]):
    for j in range(YY.shape[1]):
        ZZ[i,j] = f(XX[i,j], YY[i,j], arr)

これをベクトル化する方法はありますか?XX、YY、arr を同じ形状の 3D 配列に変換しようと考えていますが、f() の np.sum() は常にスカラーを返します。

4

1 に答える 1

2
  1. xaxis、yaxis、arr データからオープン メッシュを構築します。np.ix_()

  2. np.sum()で呼び出しaxis=-1ます。

コードは次のとおりです。

import numpy as np

### original code
def f(a, b, arr):
    X = a * np.exp(-arr**2 / b)
    return np.sum(a * np.log(X) - arr)

A_axis = np.linspace(1, 5, 8)
B_axis = np.linspace(1, 2, 9)
XX, YY = np.meshgrid(A_axis, B_axis)
arr = np.arange(10)
ZZ = np.empty_like(XX)
for i in range(XX.shape[0]):
    for j in range(YY.shape[1]):
        ZZ[i,j] = f(XX[i,j], YY[i,j], arr)

### use broadcast        
def f(a, b, arr):
    X = a * np.exp(-arr**2 / b)
    return np.sum(a * np.log(X) - arr, axis=-1)
B, A, C = np.ix_(B_axis, A_axis, arr)
result = f(A, B, C)

print np.allclose(ZZ, result)
于 2013-07-26T05:16:43.263 に答える