Numpy:在2d矩阵内沿着向量走

时间:2018-01-10 15:00:10

标签: python numpy scipy

考虑一个函数A(x(z, y), y(z))。我想从任意(x, y)开始,然后沿着z走。我有

  • dy/dz = 1
  • dx/dz = z y(1-x)/(y(y+z))。对于epsilon z,这会给出y(1-x)/(yy)

现在,采取以下离散化:

import numpy as np
x = np.linspace(0.01, 0.99, 100)
y = np.linspace(0.5, 2, 50)
X, Y = np.meshgrid(x, y, indexing='ij')
A = X*Y
d = Y*(1-X)/(Y*Y)

现在,A是(xy)中的二维函数:

A.shape
Out[25]: (100, 50)

通过构造在两个方面都在增加。

现在,A 的每个起点开始,我想沿(d,1)向量走,直到我达到{{1}以上的值}。我生成的矩阵1.5R形状相同,应该包含A维度中的网格点数。如果我从未达到该值(即y< A的相应边界),则任何可区分的输出(例如1.5)都会很棒。

由于这很难手动完成,我无法给出准确的预期输出。但是,例如,取网格点nan。让我们说在那个社区,(85, 20)大致(实际上是0.13)。这意味着我想在本地沿着(1,10)对角线移动,直到我到达d=0.1。在这种情况下,我想从A : A >= 1.5走到A[85, 20]A[85+2, 20+20]上方的第一个点,值为

1.5

所以,我沿着A[85+2, 20+20] Out[51]: 1.5023964131106988 走了20个网格点。这意味着我生成的矩阵z具有R

我对高效率的方式感兴趣,以及表现更差但更精确的解决方案。无论如何,我的解决方案必须以给定的矩阵为基础。

为了更加直观地了解我正在努力实现的目标,请考虑R[85, 20] == 20。在那种情况下,我可以简单地

dx/dz = 0

但是,在我的例子中,我不能positive = A > 1.5 iX, iY = np.meshgrid(np.arange(100), np.arange(50), indexing='ij') gridsMove = positive.argmax(axis=1)[:, np.newaxis] R = np.maximum(gridsMove-iY, 0).astype(float) # prune those here where we never arrive (argmax yields `0`, non robust test but works here) R[gridsMove.repeat(50, axis=1) == 0] = np.nan ,因为我走的是多个轴。我必须做argmax(axis=1)或类似的事情......

0 个答案:

没有答案