[英]Numpy operate over 2D array to produce 3D array
我已经生成了一个(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数组?
如果您的函数确实需要两个参数,则可能不希望将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_
实际ix_
原因
f_wrapped = np.vectorize(f)
result = f_wrapped(gridy, gridx)
请注意,根据您的情况, result
是3个元组,其中包含50 x 50的数组,即按输出分组。 如果要链接矢量化函数,这很方便。 如果要全部集中在一个大数组中,只需将result
转换为array
并可以选择使用transpose
来重新排列轴,例如
triplets_last = np.array(result).transpose((1, 2, 0))
如果我理解正确,那么您将使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.