所以,在我之前的问题中,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 dimension
与z.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中的流利程度。