Numpy在2D阵列上操作以产生3D阵列

时间:2017-01-31 23:03:36

标签: python numpy

我已将(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数组?

2 个答案:

答案 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)