这一次,这不是一个非常重要的问题,但也许是一个有趣的问题。
我们假设我们有两个变量x
和y
。这些变量取决于时间(离散时间)。我们有一个起始条件,并希望随着时间的推移迭代它们。我们假设我们有x[0] = a
和y[0] = b
。我们现在想要在很短的时间内计算所有给定点,并且我们知道这两个变量之间的以下关系:
x[n+1] = x[n] + y[n]
y[n+1] = y[n] + np.sin(x[n+1])
当然我们可以通过循环来实现:
x[0], y[0] = a, b
for n in range(100): # just an arbitrary iteration
x[n+1] = x[n] + y[n]
y[n+1] = y[n] + np.sin(x[n+1])
好。这是可能的,如果我没有犯错误=)。我想要的可能就是拥有一个更好,更numpy
的方式来解决它而不需要迭代。
我试图提出一些改变或其他的东西。我只想在没有循环的情况下对数组进行计算,导致循环真的很无聊。我刚才有一个关于递归函数调用的想法,但我必须在明天早上尝试一下。
答案 0 :(得分:2)
正如评论者所说,这不能很好地矢量化。如果您想要一个有助于提高速度的快速解决方案,请考虑inline
中的scipy.weave
选项。下面的代码是一个脚本,为您所需的离散系统提供了一个工作示例。这应该比大型数组的Python for循环要好得多。
import scipy.weave as weave
import numpy as np
def simulate_x_and_y(x,y,a,b):
x[0] = a; y[0] = b;
n_range = len(x)
code = """
#include <math.h>
for(int n = 1; n < n_range; n++){
x(n) = x(n-1) + y(n-1);
y(n) = y(n-1) + sin(x(n));
}
"""
weave.inline(code, ['x','y','n_range'],
type_converters = weave.converters.blitz,
compiler = "gcc", headers=["<math.h>"]
)
if __name__ == "__main__":
x = np.zeros(10);
y = np.zeros(10);
a = 4.0; b = 10.0;
print "Before:"
print x
print y
simulate_x_and_y(x,y,a,b)
print "After:"
print x
print y