使用来自具有多个x参数的函数的numpy.fromfunction创建x-dim数组

时间:2012-01-11 14:10:10

标签: python numpy

我想从5d函数创建一个2D(x,y)数组,比如一些内核KMID:

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:语法无效

即。我想通过迭代前两个索引来制作一个二维数组。 最优雅的方法是什么?

2 个答案:

答案 0 :(得分: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数组操作做同样的事情,使用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)

答案 1 :(得分:3)

KMID是一个函数,而不是数组,因此您无法使用:对其进行索引。做

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