Python Numpy操作二维阵列以生成三维阵列
我已经生成了一个包含Python Numpy操作二维阵列以生成三维阵列,python,numpy,Python,Numpy,我已经生成了一个包含(x,y)值的numpy数组,作为nxn网格 grid = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))[0] grid.shape // (50, 50, 1) 我有一个函数,它接受两个参数并返回3个值。 i、 e.(x,y)->(a,b,c) 如何在2d numpy数组上应用该函数以获得3d numpy数组?如果我理解正确,您需要的是np.vectorizedecorator。通过使用它,您可以在m
(x,y)
值的numpy数组,作为nxn
网格
grid = np.meshgrid(np.linspace(0, 1, 50), np.linspace(0, 1, 50))[0]
grid.shape // (50, 50, 1)
我有一个函数,它接受两个参数并返回3个值。
i、 e.(x,y)->(a,b,c)
如何在2d numpy数组上应用该函数以获得3d numpy数组?如果我理解正确,您需要的是
np.vectorize
decorator。通过使用它,您可以在meshgrid
上应用函数。但是,函数应该只接受一个参数,因为不传递坐标,而是传递坐标处的值(除非值是带有两个元素的薄纱)
如果您的函数真的需要两个参数,您可能不希望将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\ux
实际上是有效的
f_wrapped = np.vectorize(f)
result = f_wrapped(gridy, gridx)
请注意,result
在您的示例中是一个由50 x 50个数组组成的3元组,即按输出分组。如果要链接矢量化函数,这很方便。如果您想将所有数据都放在一个大数组中,只需将结果
转换为数组
,并可以选择使用转置
来重新排列轴,例如
triplets_last = np.array(result).transpose((1, 2, 0))
我不清楚
(x,y)
值数组在nxn
网格上是什么样子的。。。这是否意味着您有一个二维元组数组?
triplets_last = np.array(result).transpose((1, 2, 0))