我有我的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]])
我可以在几行中做到这一点,但我正在寻找最简洁,最优雅的代码。
答案 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
。