Python 绘制包含向量的两个变量的函数

Python 绘制包含向量的两个变量的函数,python,numpy,matplotlib,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)

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

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,这就是为什么我尝试使用网格网格的原因。错误是:

ValueError: operands could not be broadcast together with shapes (9,) (7,10) 
我甚至很清楚为什么会是这种情况,我认为python会像f1那样做,这样Z1可以是一个网格答案,您可以绘制它。但是如果我在函数中使用向量和非常讨厌的求和运算会怎么样呢

问题:如何更改函数f2来解决此问题,或者是否有其他方法(3D、轮廓等)绘制f2而不通过网格方式


非常感谢

你的问题不是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,7,10)
vec[:,None,None]-x[None]
然后出去塑造
(10,7,9)
。最后,我们使用
np.sum(…,0)
计算第一维上的和,以生成一个
(7,10)
数组,如下所示:

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


简化此类操作的另一个有用工具是,它从一组适合通过以下网络广播的输入向量构建“开放网格”:

v_, y_, x_ = np.ix_(inputvec, y, x)     # here x and y are 1D
z = np.sum(np.exp(-(v_ - x_) / y_), 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,7,10)
vec[:,None,None]-x[None]
然后出去塑造
(10,7,9)
。最后,我们使用
np.sum(…,0)
计算第一维上的和,以生成一个
(7,10)
数组,如下所示:

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


简化此类操作的另一个有用工具是,它从一组适合通过以下网络广播的输入向量构建“开放网格”:

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

问题是您正在尝试执行
vec-x
,其中
vec.shape=(9,)
x.shape=(7,10)
。你希望计算结果是什么?我试着用f1来解释。最终,我想绘制一个由两个变量组成的函数,该函数的输出是一个数字,因此是可绘制的。如果输入x和y作为数字,该函数可以正常工作。但是当我进入网格作为输入时,就像你说的那样,它就不再工作了。。我知道为什么,只是不知道该怎么办!问题是您正在尝试执行
vec-x
,其中
vec.shape=(9,)
x.shape=(7,10)
。你希望计算结果是什么?我试着用f1来解释。最终,我想绘制一个由两个变量组成的函数,该函数的输出是一个数字,因此是可绘制的。如果输入x和y作为数字,该函数可以正常工作。但是当我进入网格作为输入时,就像你说的那样,它就不再工作了。。我知道为什么,只是不知道该怎么办!谢谢那正是我想要的!我怎样才能更好地表述这个问题,我想我不知道广播!另外,你的版本没有完全工作,我想,我会做一些快速的改变,让我知道如果你同意!(我想广播是从尾随维度开始的。)你能解释一下为什么你认为我的版本不起作用吗?根据输入数组的形状,广播可以在任何维度上进行(请参阅我链接到的文档中的“一般广播规则”)。我认为这是一个功能:“它从后面的维度开始,并向前推进。当两个维度是兼容的:1.它们相等,或2.其中一个是1”。所以3D数组的尾随维度是10,其中inputvec的尾随维度是9。这就是我得到错误的原因:“:形状不匹配:对象不能广播到单个形状”。转置修复了这一问题,因为它与需要组合在一起的轴相匹配。抱歉,这是我的疏忽-我已经在IPython会话中对您的
inputvec
变量进行了重塑,但忘记了它。您可以使用
x[None].T
并在建议的编辑中播放最后一个维度,也可以在
vec
中插入额外维度并在第一个维度上播放,如在我的更新中。我还提到了
np.ix
,它可以避免显式地为
X
Y
创建二维网格(请参见
np.ogrid
)。抱歉搞混了!谢谢,这真的很有帮助。讽刺的是,我的问题变得更加复杂,但这远远超出了这个问题的范围……谢谢!那正是我想要的!我怎样才能更好地表述这个问题,我想我不知道广播!另外,你的版本没有完全工作,我想,我会做一些快速的改变,让我知道如果你同意!(我想广播是从尾随维度开始的。)你能解释一下为什么你认为我的版本不起作用吗?根据输入数组的形状,广播可以在任何维度上进行(请参阅我链接到的文档中的“一般广播规则”)。我认为这是一个功能:“它从后面的维度开始,并向前推进。当两个维度是兼容的:1.它们相等,或2.其中一个是1”。所以3D数组的尾随维度是10,其中inputvec的尾随维度是9。这就是我得到错误的原因:“:形状不匹配:对象不能广播到单个形状”。转置修复了这一问题,因为它与需要组合在一起的轴相匹配。抱歉,这是我的疏忽-我已经在IPython会话中对您的
inputvec
变量进行了重塑,但忘记了它。您可以使用
x[None].T
并在最后一个维度上广播