与numpy.view

时间:2017-11-20 07:31:48

标签: python numpy pointers scipy

我尝试解决2个耦合方程系统,这里称为系统A和系统B.这两个系统中的一个是ODE系统。 为了避免在两个系统之间复制共享数据,我希望有一个带指针的结构。为此,我使用了numpy.view的机制。

一些代码:

import numpy as np
import scipy

t0,t1,dt = 0.0,5.0, 1.0

data = np.ones((5,2))
data[:,1]*=2

y=np.array([0.0,0.0])     ### no matter default value

r = scipy.integrate.ode(f)
r.set_integrator('dopri5', rtol=1e-3, atol=1e-6 )
r.set_f_params(0.05)

#r.set_initial_value(y, t0); r._y = data[2]   ### Apparently equivalent
r.set_initial_value(data[2], t0)                   ### Apparently equivalent

print(np.shares_memory(r.y,y))
print(np.shares_memory(r.y,data))

这里,在初始状态,我在r.y(系统A)和数据[2]之间有一个同步(名为data的变量是系统B的数据)。如果我修改一个,另一个也被修改,反之亦然。磁带命令r.y.base确认r.y只是名为data的数组的视图。那是我想要的行为。

现在,问题从这里开始。如果我的EDO系统取得进展:

while r.successful() and r.t < t1:
    r.integrate(r.t+dt, step=True)
    print(r.t+dt,r.y)

print(np.shares_memory(r.y,data))     
print(data)

数据和r.y不再同步。 r.y不再是数据视图。 它看起来集成函数创建了它的属性r.y的新实例,而不仅仅是更新它。我已经阅读了这个函数的源代码

https://github.com/scipy/scipy/blob/v0.19.1/scipy/integrate/_ode.py#L396

但它迅速提到了fortran代码,我的理解能力就此止步。

如何通过r.y和数据之间的数据复制的不同方式解决(或解决)这个问题(这也意味着手动管理同步)? 这可能是scipy中的一个错误吗?

感谢您的帮助

0 个答案:

没有答案