我已将(x, y)
值的numpy数组生成为N x N
网格。
grid = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))[0]
grid.shape // (50, 50, 1)
我有一个带两个参数并返回3个值的函数。
即(x, y) -> (a, b, c)
如何在2d numpy数组上应用该函数以获得3d numpy数组?
答案 0 :(得分:3)
如果你的函数确实需要两个参数,你可能想要将2d映射到3d,而不是2xMxN到3xMxN。为此,您的第一行更改为
gridx, gridy = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))
甚至使用更经济的ix_
,它具有不交换轴的优势
gridy, gridx = np.ix_(np.linspace(0, 1, 50), np.linspace(0, 1, 50))
如果你的函数f
没有处理数组参数,那么@Jacques Gaudin指出np.vectorize
可能是你想要的。请注意vectorize
主要是一种便利功能,它不会使事情变得更快。它有用的东西,如广播,这就是为什么使用ix_
实际工作
f_wrapped = np.vectorize(f)
result = f_wrapped(gridy, gridx)
请注意,在您的情况下,result
是一个50 x 50阵列的3元组,即按输出分组。如果要链接矢量化函数,这很方便。如果您希望所有人都在一个大数组中,只需将result
转换为array
,并可选择使用transpose
重新排列轴,例如
triplets_last = np.array(result).transpose((1, 2, 0))
答案 1 :(得分:1)
如果我理解正确,你就是np.vectorize
装饰者。通过使用它,您可以在meshgrid
上应用函数。您的函数应该只接受一个参数,因为您没有传递坐标而是坐标处的值(除非值是带有两个元素的tulpes)。
import numpy as np
grid = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))[0]
@np.vectorize
def func(a):
return (a, a**.5, a**2)
res = np.array(list(func(grid)))
print(res.shape)
print(res)