1

「x」値の大きな 2 次元配列を計算するのに非常に時間がかかる 1 次元関数があるため、SciPy 機能を使用して内挿関数を作成し、それを使用して y を計算するのは非常に簡単です。はるかに高速。ただし、1 次元を超える配列では補間関数を使用できません。

例:

# First, I create the interpolation function in the domain I want to work
x = np.arange(1, 100, 0.1)
f = exp(x) # a complicated function
f_int = sp.interpolate.InterpolatedUnivariateSpline(x, f, k=2)

# Now, in the code I do that
x = [[13, ..., 1], [99, ..., 45], [33, ..., 98] ..., [15, ..., 65]]
y = f_int(x)
# Which I want that it returns y = [[f_int(13), ..., f_int(1)], ..., [f_int(15), ..., f_int(65)]]

しかし、戻ります:

ValueError: object too deep for desired array

すべての x メンバーをループできることはわかっていますが、それがより良いオプションであるかどうかはわかりません...

ありがとう!

編集:

そのような関数も仕事をします:

def vector_op(function, values):

    orig_shape = values.shape
    values = np.reshape(values, values.size)

    return np.reshape(function(values), orig_shape)

np.vectorize を試しましたが、遅すぎます...

4

3 に答える 3

2

f_int1 次元データが必要な場合は、入力を平坦化し、補間器に入力してから、元の形状を再構築する必要があります。

>>> x = np.arange(1, 100, 0.1)
>>> f = 2 * x # a simple function to see the results are good
>>> f_int = scipy.interpolate.InterpolatedUnivariateSpline(x, f, k=2)

>>> x = np.arange(25).reshape(5, 5) + 1
>>> x
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])
>>> x_int = f_int(x.reshape(-1)).reshape(x.shape)
>>> x_int
array([[  2.,   4.,   6.,   8.,  10.],
       [ 12.,  14.,  16.,  18.,  20.],
       [ 22.,  24.,  26.,  28.,  30.],
       [ 32.,  34.,  36.,  38.,  40.],
       [ 42.,  44.,  46.,  48.,  50.]])

x.reshape(-1)平坦化を行い、.reshape(x.shape)元の形に戻します。

于 2013-03-01T17:27:15.633 に答える
0

list comprehensionとの組み合わせを使用しますmap(欠落しているネストされた 2 つを使用する方法があるかもしれませんmaps)

In [24]: x
Out[24]: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

In [25]: [map(lambda a: a*0.1, x_val) for x_val in x]
Out[25]: 
[[0.1, 0.2, 0.30000000000000004],
 [0.1, 0.2, 0.30000000000000004],
 [0.1, 0.2, 0.30000000000000004]]

これは説明のためのものです....lambda a: a*0.1あなたの関数に置き換えてください、f_int

于 2013-03-01T17:06:26.297 に答える