优雅地生成numpy中的结果数组

时间:2018-02-10 11:19:49

标签: numpy

我有我的X和Y numpy数组:

X = np.array([0,1,2,3])
Y = np.array([0,1,2,3])

我的函数将x,y值映射到Z点:

def z(x,y):
    return x+y

我希望产生3D绘图所需的显而易见的东西:相应Z值的2维numpy数组。我相信它应该是这样的:

Z = np.array([[0, 1, 2, 3],
              [1, 2, 3, 4],
              [2, 3, 4, 5],
              [3, 4, 5, 6]])

我可以在几行中做到这一点,但我正在寻找最简洁,最优雅的代码。

2 个答案:

答案 0 :(得分:2)

对于array意识到使用开放网格更经济的功能:

>>> import numpy as np
>>> 
>>> X = np.array([0,1,2,3])
>>> Y = np.array([0,1,2,3])
>>> 
>>> def z(x,y):
...     return x+y
... 
>>> XX, YY = np.ix_(X, Y)
>>> XX, YY
(array([[0],
       [1],
       [2],
       [3]]), array([[0, 1, 2, 3]]))
>>> z(XX, YY)
array([[0, 1, 2, 3],
       [1, 2, 3, 4],
       [2, 3, 4, 5],
       [3, 4, 5, 6]])

如果您的网格轴是范围,您可以使用np.ogrid

直接创建网格
>>> XX, YY = np.ogrid[:4, :4]
>>> XX, YY
(array([[0],
       [1],
       [2],
       [3]]), array([[0, 1, 2, 3]]))

如果该功能不是array,则可以使用np.vectorize来实现:

>>> def f(x, y):
...    if x > y:
...        return x
...    else:
...        return -x
... 
>>> np.vectorize(f)(*np.ogrid[-3:4, -3:4])
array([[ 3,  3,  3,  3,  3,  3,  3],
       [-2,  2,  2,  2,  2,  2,  2],
       [-1, -1,  1,  1,  1,  1,  1],
       [ 0,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  1,  1, -1, -1, -1],
       [ 2,  2,  2,  2,  2, -2, -2],
       [ 3,  3,  3,  3,  3,  3, -3]])

答案 1 :(得分:1)

实现目标的一个非常简短的方法是从坐标产生meshgrid

X,Y = np.meshgrid(x,y)
z = X+Y

或更一般:

z = f(X,Y)

甚至是一行:

z = f(*np.meshgrid(x,y))

修改

如果你的函数也可能返回一个常量,你必须以某种方式推断结果应该具有的维度。如果你想继续使用meshgrids,一个非常简单的方法是以这种方式重写你的函数:

def f(x,y):
   return x*0+y*0+a

a将是你的常数。然后numpy将为您处理维度。这当然有点奇怪,所以你可以写

def f(x,y):
   return np.full(x.shape, a)

如果你真的想要使用兼容标量和数组的函数,那么最好与@ {Paulisan的答案一样使用np.vectorize