2012-01-11 60 views
2

我想創建從圖5d函數二維(X,Y)陣列更多,說一些內核KMID:創建使用numpy.fromfunction從函數的x維數組具有大於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

即我想要通過遍歷只是第一個二維數組兩個指數。 什麼是最優雅的方式來做到這一點?

回答

3

KMID是一個函數,而不是一個數組,所以你不能用:索引它。做

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

很酷,很簡單,它的作品! – 2012-01-11 14:46:40

4

不要使用np.fromfunction這一點,因爲KMID可以接受numpy的數組作爲參數:

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的循環語法糖如果你能做到同樣的事情。使用numpy數組操作,它會更快)


但是,如果您確實需要回答您的問題使用np.fromfunction,而是想提供一些參數作爲常量,那麼你可以使用functools.partial

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的提示以及如何避免使用它,我不知道它很慢。 – 2012-01-11 16:08:48

相關問題