绘制两个变量的函数,其中包含

时间:2015-11-24 15:19:16

标签: python numpy matplotlib

我有以下问题,这是最小的例子:

import numpy as np
def f1(x,y,scal):
    return np.exp(-(scal-x)/y)
def f2(x,y,vec):
    return np.sum(np.exp(-(vec-x)/y))

inputvec = np.arange(1,10,1)

x = np.arange(10)
y = np.arange(1,8,1)
X,Y = np.meshgrid(x,y)
Z1 = f1(X,Y,20)
print Z1
Z2 = f2(X,Y,inputvec)

我想用3D绘制函数f2,所以这就是我尝试使用meshgrid的原因。错误是:

ValueError: operands could not be broadcast together with shapes (9,) (7,10) 

我甚至清楚为什么会这样,我认为python会像f1这样做,所以Z1可以是你可以绘制的网格答案。但是如果我在我的函数中使用向量和非常讨厌的求和操作会怎样。

问题:如何更改我的函数f2以解决此问题,或者是否有不同的方法(3D,Contour等)绘制f2而不通过meshgrid方式?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的问题并非100%明确,但我您想要

def f3(x,y,vec):
    return np.sum(np.exp(-(vec[:, None, None] - x[None]) / y[None]), 0)

使用None(或等效地使用np.newaxis)进行索引会插入一个大小为1的新维度,因此vec[:, None, None]具有形状(9, 1, 1)x[None]以及{ {1}}具有形状y[None](1, 7, 10)然后broadcastvec[:, None, None] - x[None]塑造成(10, 7, 9)。最后,我们使用np.sum(..., 0)计算第一维的总和,得到一个(7, 10)数组,如下所示:

Z3 = f3(X, Y, inputvec)
plt.pcolormesh(X, Y, Z3)

enter image description here

另一个简化此类操作的有用工具是np.ix_,它构建了一组适合广播的输入向量的“开放网格”:

v_, y_, x_ = np.ix_(inputvec, y, x)     # here x and y are 1D
z = np.sum(np.exp(-(v_ - x_) / y_), 0)