使用numpy.fromfunction从多个参数的函数创建x维数组

2 投票
2 回答
1669 浏览
提问于 2025-04-17 10:00

我想从一个五维的函数,比如说某个叫KMID的核,创建一个二维的(x,y)数组。

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)

这样做会得到:

语法错误:无效的语法

也就是说,我想通过只遍历前两个索引来制作一个二维数组。有什么优雅的方法可以做到这一点吗?

2 个回答

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)
3

KMID 是一个函数,不是一个数组,所以你不能用 : 来索引它。你应该这样做:

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

撰写回答