我有以下问题,这是最小的例子:
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方式?
非常感谢!
答案 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)
然后broadcast将vec[:, None, None] - x[None]
塑造成(10, 7, 9)
。最后,我们使用np.sum(..., 0)
计算第一维的总和,得到一个(7, 10)
数组,如下所示:
Z3 = f3(X, Y, inputvec)
plt.pcolormesh(X, Y, Z3)
另一个简化此类操作的有用工具是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)