使用形式为f(x,y)= f(x,y,z)的函数的其他数据.sum(axis = -1)

时间:2015-10-27 13:35:26

标签: python lambda

所以,在我之前的问题中,wflynny给了我一个非常巧妙的解决方案(Surface where height is a function of two functions, and a sum over the third)。我已经为我的简单版本工作了,但现在我正在努力改进这个。

考虑以下lambda函数:

<Window x:Class="AvalonDock.MVVMTestApp.NewWindow"
    ....
    xmlns:local="clr-namespace:AvalonDock.MVVMTestApp">

  <avalonDock:DockingManager.LayoutItemTemplateSelector>
    <local:PanesTemplateSelector>
      <local:PanesTemplateSelector.FileViewTemplate>
        <DataTemplate>
           <!--<TextBox Text="{Binding TextContent, UpdateSourceTrigger=PropertyChanged}"/>-->            
           <local:SomeUserControl/>
        </DataTemplate>
      </local:PanesTemplateSelector.FileViewTemplate>      
    .....                               
  </avalonDock:DockingManager.LayoutItemTemplateSelector>
</Window>

现在,在这种情况下它可以工作。事实上, x = np.arange(0,100, 0.1) y = np.sin(y); f = lambda xx: (xx-y[x=xx])**2 values = f(x) 在这个例子中是微不足道的。但是,该示例可以扩展:

[x=xx]

在这种情况下,会生成错误 x = np.arange(0,100, 0.1) z = np.sin(y); f = lambda xx, yy: ( (xx-z[x=xx])**2 + yy**2)**0.5 y = np.arange(0,100,0.1) [xgrid, ygrid] = np.meshgrid(x,y); values = f(xgrid,ygrid) 。这是因为我认为ValueError: boolean index array should have 1 dimensionz.shape不同。

请注意,xgrid.shape是一种简化。它不是一个函数,而是一个任意值的数组。我们真的需要去那个数组来检索它们。

我不知道实现这个的正确方法是什么。我将尝试一些东西,但我希望这里的某个人会给我提示或者提供正确的方法在Python中执行此操作。

编辑:我原本以为我用以下方法解决了它:

y=np.sin(y)

然而,这只会返回retrieve = lambda pp: map(lambda pp: dataArray[pp==phiArray][0], phi) 。假设dataArray包含极半径的多个“最大”值。然后,你通常会说dataArray之类的东西。如果半径太大,那么g将恰好为零。

然而,这不起作用。我不完全确定,但行为似乎是采用g = lambda xx, yy: f(xx,yy) * Heaviside( dataArray - radius(xx,yy))的单个值而不是整个数组。

谢谢!

编辑:可悲的是,这些东西必须工作,我不能花更多的时间来使它变得更好。因此,我选择了脏实现。我感兴趣的实际内容是上面写的dataArray,所以我可以直接(脏)而不是很好地实现(没有嵌套的for循环)。

g = lambda xx, yy

最后的手段,但它的确有效。并且,有时候结果比编写好的代码更重要,特别是当有最后期限出现时(并且你是唯一一个关心良好代码的人)。

如果有正确的方法,我仍然非常有兴趣学习如何正确地做到这一点,从而提高我在干净的Python中的流利程度。

0 个答案:

没有答案