2012-01-11 10 views
2

と機能からnumpy.fromfunctionを用いたX-DIM配列を作成Iは、5D関数から2D(x、y)のアレイを作成するようないくつかのカーネルKMIDを言う:以上のXパラメータ

import numpy as np 
def KMID(x,y,mumid,delta,cmid): 
    rsq=(x-float(len(x))/2.+0.5)**2+(y-float(len(y))/2.+0.5)**2 
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2) 
このような何かによって

は:

shape=256,256 
midscatterkernel=np.fromfunction(KMID(:,:,0.1,0.2,0.3),shape) 

これは与える:

SyntaxError: invalid syntax

はつまり、私はちょうど最初の反復処理により、2次元配列を作りたいです2つの指標。 これを行う最もエレガントな方法は何ですか?

答えて

3

KMIDは配列ではないため、:でインデックス化することはできません。やる

midscatterkernel=np.fromfunction(lambda x, y: KMID(x,y,0.1,0.2,0.3), shape) 
+0

、クール非常にシンプルで、それは動作します:np.fromfunctionを使用しますが、定数として、引数の一部を提供したかったし、その後はfunctools.partialを使用することができます! –

4

KMIDが引数としてnumpyの配列を受け入れることができるので、このためのnp.fromfunctionを使用しないでください:

import numpy as np 

def KMID(x, y, mumid, delta, cmid): 
    rsq = (x-len(x)/2.+0.5)**2+(y-len(y)/2.+0.5)**2 
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2) 

lenx, leny = 256, 256 
midscatterkernel = KMID(
    np.arange(lenx), 
    np.arange(leny)[:, np.newaxis], 
    0.1, 0.2, 0.3) 

np.fromfunctionが遅いPythonのforループ構文糖であるあなたが同じことを行うことができます。あなたが必要性をした場合は、しかし、あなたの質問に答えるためにnumpyの配列操作で、numpyの配列操作を使用しています。それは速くなります。)


import functools 
def KMID(x, y, mumid, delta, cmid): 
    rsq = (x-len(x)/2.+0.5)**2+(y-len(y)/2.+0.5)**2 
    return cmid*np.exp(-mumid*np.sqrt(rsq))/(rsq+delta**2) 

shape = 256, 256 
midscatterkernel = np.fromfunction(functools.partial(KMID,mumid=0.1,delta=0.2,cmid=0.3),shape) 
+0

np.fromfunctionのヒントとそれを避ける方法を教えてくれてありがとうございました。 –

関連する問題