- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
一段时间以来,我一直想知道在 Python 中模拟任意非线性(随机的确定性)动力系统的最有效方法是什么。我最终做了很多教学或研究。我相信一定有一种简单有效的方法可以做到这一点。
今晚在酒吧里我想到了以下...
def iterate(F, X, T, **params):
"""Iterate a non-linear map F starting from some initial condition X for T periods."""
t = 0
while t < T:
yield X
X = F(X, **params)
t += 1
...使用 Tinkerbell Map 的测试用例...
def tinker_bell_map(X, a, b, c, d):
return [X[0]**2 - X[1]**2 + a * X[0] + b * X[1], 2 * X[0] * X[1] + c * X[0] + d * X[1]]
...产量...
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 10, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 26 µs per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 100, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 254 µs per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 1000, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 2.36 ms per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 10000, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 19.6 ms per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 100000, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 192 ms per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 1000000, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 2.02 s per loop
%timeit -n 1 -r 3 [X for X in iterate(tinker_bell_map, [-0.72, -0.64], 10000000, a=0.9, b=-0.6013, c=2.0, d=0.5)]
1 loops, best of 3: 20.5 s per loop
...我已经为确定性和随机系统尝试了其他几个测试用例,并且上面的效果非常好。虽然我认为上面的内容非常好,但我想知道是否可以使用 Numba 使其更快?
这是我一直在研究的两个暂定解决方案...
@njit
def tinker_bell_map(X, params):
out = [X[0]**2 - X[1]**2 + params[0] * X[0] + params[1] * X[1],
2 * X[0] * X[1] + params[2] * X[0] + params[3] * X[1]]
return out
def simulator_factory(F):
@njit
def simulator(initial_condition, T, params):
"""Iterate a non-linear map starting from some X for T periods."""
X = np.empty((initial_condition.shape[0], T + 1))
X[:, 0] = initial_condition # here is the offending line!
for t in xrange(T):
X[:, t+1] = F(X[:, t], params)
return X
return simulator
def iterator_factory(F):
@njit
def iterator(X, T, params):
"""Iterate a non-linear map starting from some X for T periods."""
t = 0
while t < T:
yield X
X = F(X, params) # this is the offending line!
t += 1
return iterator
...不幸的是,两者都不起作用...
In [8]: f(np.array([-0.72, -0.64]), 10, np.array([0.9, -0.6013, 2.0, 0.5]))
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-8-d4c0195e7f4e> in <module>()
----> 1 f(np.array([-0.72, -0.64]), 10, np.array([0.9, -0.6013, 2.0, 0.5]))
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/dispatcher.pyc in _compile_for_args(self, *args, **kws)
163 assert not kws
164 sig = tuple([self.typeof_pyval(a) for a in args])
--> 165 return self.compile(sig)
166
167 def inspect_llvm(self, signature=None):
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/dispatcher.pyc in compile(self, sig)
301 self.py_func,
302 args=args, return_type=return_type,
--> 303 flags=flags, locals=self.locals)
304
305 # Check typing error if object mode is used
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_extra(typingctx, targetctx, func, args, return_type, flags, locals, library)
593 pipeline = Pipeline(typingctx, targetctx, library,
594 args, return_type, flags, locals)
--> 595 return pipeline.compile_extra(func)
596
597
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_extra(self, func)
316 raise e
317
--> 318 return self.compile_bytecode(bc, func_attr=self.func_attr)
319
320 def compile_bytecode(self, bc, lifted=(), lifted_from=None,
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_bytecode(self, bc, lifted, lifted_from, func_attr)
325 self.lifted_from = lifted_from
326 self.func_attr = func_attr
--> 327 return self._compile_bytecode()
328
329 def compile_internal(self, bc, func_attr=DEFAULT_FUNCTION_ATTRIBUTES):
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in _compile_bytecode(self)
580
581 pm.finalize()
--> 582 return pm.run(self.status)
583
584
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in run(self, status)
207 # No more fallback pipelines?
208 if is_final_pipeline:
--> 209 raise patched_exception
210 # Go to next fallback pipeline
211 else:
TypingError: Caused By:
Traceback (most recent call last):
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 201, in run
res = stage()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 415, in stage_nopython_frontend
self.locals)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 710, in type_inference_stage
infer.propagate()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 408, in propagate
self.constrains.propagate(self.context, self.typevars)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 113, in propagate
loc=constrain.loc)
TypingError: Internal error at <numba.typeinfer.CallConstrain object at 0x10c5a7d50>:
Caused By:
Traceback (most recent call last):
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 201, in run
res = stage()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 415, in stage_nopython_frontend
self.locals)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 709, in type_inference_stage
infer.build_constrain()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 395, in build_constrain
self.constrain_statement(inst)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 519, in constrain_statement
self.typeof_assign(inst)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 555, in typeof_assign
self.typeof_expr(inst, inst.target, value)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 672, in typeof_expr
raise NotImplementedError(type(expr), expr)
NotImplementedError: (<class 'numba.ir.Expr'>, build_list(items=[Var($0.27, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (18)), Var($0.52, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (19))]))
Failed at nopython (nopython frontend)
(<class 'numba.ir.Expr'>, build_list(items=[Var($0.27, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (18)), Var($0.52, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (19))]))
File "sandbox.py", line 45
Failed at nopython (nopython frontend)
Internal error at <numba.typeinfer.CallConstrain object at 0x10c5a7d50>:
Caused By:
Traceback (most recent call last):
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 201, in run
res = stage()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 415, in stage_nopython_frontend
self.locals)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 709, in type_inference_stage
infer.build_constrain()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 395, in build_constrain
self.constrain_statement(inst)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 519, in constrain_statement
self.typeof_assign(inst)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 555, in typeof_assign
self.typeof_expr(inst, inst.target, value)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 672, in typeof_expr
raise NotImplementedError(type(expr), expr)
NotImplementedError: (<class 'numba.ir.Expr'>, build_list(items=[Var($0.27, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (18)), Var($0.52, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (19))]))
Failed at nopython (nopython frontend)
(<class 'numba.ir.Expr'>, build_list(items=[Var($0.27, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (18)), Var($0.52, /Users/drpugh/Research/python-dev/ramseyPy/sandbox.py (19))]))
File "sandbox.py", line 45
...以及模拟器工厂...
In [10]: s = simulator_factory(tinker_bell_map)
In [11]: s(np.array([-0.72, -0.64]), 10, np.array([0.9, -0.6013, 2.0, 0.5]))
---------------------------------------------------------------------------
TypingError Traceback (most recent call last)
<ipython-input-11-049d0797e27e> in <module>()
----> 1 s(np.array([-0.72, -0.64]), 10, np.array([0.9, -0.6013, 2.0, 0.5]))
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/dispatcher.pyc in _compile_for_args(self, *args, **kws)
163 assert not kws
164 sig = tuple([self.typeof_pyval(a) for a in args])
--> 165 return self.compile(sig)
166
167 def inspect_llvm(self, signature=None):
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/dispatcher.pyc in compile(self, sig)
301 self.py_func,
302 args=args, return_type=return_type,
--> 303 flags=flags, locals=self.locals)
304
305 # Check typing error if object mode is used
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_extra(typingctx, targetctx, func, args, return_type, flags, locals, library)
593 pipeline = Pipeline(typingctx, targetctx, library,
594 args, return_type, flags, locals)
--> 595 return pipeline.compile_extra(func)
596
597
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_extra(self, func)
316 raise e
317
--> 318 return self.compile_bytecode(bc, func_attr=self.func_attr)
319
320 def compile_bytecode(self, bc, lifted=(), lifted_from=None,
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in compile_bytecode(self, bc, lifted, lifted_from, func_attr)
325 self.lifted_from = lifted_from
326 self.func_attr = func_attr
--> 327 return self._compile_bytecode()
328
329 def compile_internal(self, bc, func_attr=DEFAULT_FUNCTION_ATTRIBUTES):
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in _compile_bytecode(self)
580
581 pm.finalize()
--> 582 return pm.run(self.status)
583
584
/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.pyc in run(self, status)
207 # No more fallback pipelines?
208 if is_final_pipeline:
--> 209 raise patched_exception
210 # Go to next fallback pipeline
211 else:
TypingError: Caused By:
Traceback (most recent call last):
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 201, in run
res = stage()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 415, in stage_nopython_frontend
self.locals)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/compiler.py", line 710, in type_inference_stage
infer.propagate()
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 408, in propagate
self.constrains.propagate(self.context, self.typevars)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 107, in propagate
constrain(context, typevars)
File "/Users/drpugh/anaconda/lib/python2.7/site-packages/numba/typeinfer.py", line 304, in __call__
(ty, it, vt), loc=self.loc)
TypingError: Cannot resolve setitem: array(float64, 2d, C)[(slice3_type, int32)] = array(float64, 1d, C)
File "sandbox.py", line 29
Failed at nopython (nopython frontend)
Cannot resolve setitem: array(float64, 2d, C)[(slice3_type, int32)] = array(float64, 1d, C)
File "sandbox.py", line 29
```
这里的问题似乎与我尝试将数组分配给切片有关。
目前发现 Numba 有点令人沮丧......
最佳答案
我认为这可能与 njit
装饰器非常对 nopython 的含义非常严格有关。创建新矩阵和切片分配在 njit 中似乎都失败了。此外,您代码中的 tinker_bell_map 的 njit
版本返回一个列表(一个 python 对象)而不是一个数组。
将示例重构回最基本的结构,似乎只要进行足够的按摩,numba 就做得非常出色。 (numpy 1.9.2 和 numba 0.14)
import numba
from numba import *
from numpy import *
import numpy as np
@njit
def simulator(initial_condition, params, X):
a = params[0]
b = params[1]
c = params[2]
d = params[3]
X[0, 0] = initial_condition[0]
X[1, 0] = initial_condition[1]
for t in range(1, X.shape[1]):
u = X[0, t-1]
v = X[1, t-1]
X[0, t] = u**2 - v**2 + a * u + b * v
X[1, t] = 2 * u * v + c * u + d * v
return X
时间
x0 = np.array([-0.72, -0.64])
params = np.array([0.9, -0.6013, 2.0,0.5])
xs = np.zeros((2, 10000000 ))
%timeit -n 1 -r 3 simulator(x0, params, xs)
1 loops, best of 3: 70.7 ms per loop
xs = np.zeros((2, 100000000 ))
%timeit -n 1 -r 3 simulator(x0, params, xs)
1 loops, best of 3: 715 ms per loop
更接近原始的例子
@njit
def tinker_bell_map(X, params, out):
out[0] = X[0]**2 - X[1]**2 + params[0] * X[0] + params[1] * X[1]
out[1] = 2 * X[0] * X[1] + params[2] * X[0] + params[3] * X[1]
def simulator_factory(f):
def simulator(x0, params, x):
for i in xrange(2):
x[i,0] = x0[i]
for t in xrange(1, x.shape[1]):
f(x[:,t-1], params, x[:,t])
return x
return njit(simulator)
xs = np.zeros((2, 10))
sim = simulator_factory(tinker_bell_map)
print sim(x0, params, xs)
更新时间:
xs = np.zeros((2, 10000000 ))
%timeit -n 1 -r 3 sim(x0, params, xs)
1 loops, best of 3: 272 ms per loop
xs = np.zeros((2, 100000000 ))
%timeit -n 1 -r 3 sim(x0, params, xs)
1 loops, best of 3: 2.73 s per loop
关于python - 通过numba在Python中高效模拟任意动力系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32046528/
我想要以下内容: void foo( /* something representing a function f */, /* arguments a1, a2, etc. in s
简而言之,我想声明一个这样的特征: trait Test { def test(amount: Int): A[Int] // where A must be a Monad } 这样我就可以
在 GWT 中,如何在 onModuleLoad 方法中插入框架集以及相对嵌套的框架集和框架,以合并许多小程序和其他小部件和 HTML?代码片段是: 公共(public)类 MainEntryPoin
这个问题在这里已经有了答案: How do I best simulate an arbitrary univariate random variate using its probability
我对java相当陌生,并且习惯于枚举本质上只不过是一个命名的整数列表。 现在我正在编写一个实现,其中父类有几个采用枚举值作为参数的方法。枚举将在子类中定义,并且会略有不同。由于枚举基本上看起来像类,所
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
想象一下 6-7 台服务器的设置都完全相同Java 版本“1.6.0_18”OpenJDK 运行时环境 (IcedTea6 1.8) (fedora-36.b18.fc11-i386)OpenJDK
这个问题在这里已经有了答案: What are some uses of template template parameters? (10 个答案) 关闭 4 年前。 我有一个根据策略舍入值的函数
我正在寻找如何在 Java 中给定一个 Async CompletableFutures 列表,以便前 N 个中的任何一个成功完成或失败。除非没有 N 次成功,否则忽略任何失败。 有这方面的例子吗?
我面临的问题是项目已经使用集群编程来分配任务。 if (cluster.isMaster) { // Fork workers. for (var i = 0; i { }); } el
我正在为 Luxology modo(3D 和 VFX 应用程序)编写脚本,该脚本使用 python 作为脚本语言。在我的脚本中的某个位置,我正在读取从其他应用程序输出的文本文件,并从该文本文件的行创
这个问题在这里已经有了答案: Fast arbitrary distribution random sampling (inverse transform sampling) (5 个答案) 关闭
我只是遇到了一个问题,我有一个结构数组,例如 package main import "log" type Planet struct { Name string `json:"
我正在尝试将 class ResponseResult 编码为 json case class ResponseResult (var Code : Int, var
我想将一个矩阵中的一个 block 复制到另一个矩阵的一部分中。要将其与任何类型的 n 维数组一起使用,我需要通过 [] 运算符应用带有偏移量的列表。有办法做到这一点吗? mat_bigger[0:5
我有一个匹配一组数字和字母的正则表达式。但是我希望能够排除任何三个连续的字母。这是为了防止意外形成单词或缩写。 我的表达如下。它还排除了一些类似的字符,如 0、o、O 和 1、i、I、l): ^[2-
根据documentation . 应匹配任何字符,但不匹配重音字符。 mysql> select 'test' regexp 't.st'; +----------------------+ | '
我该如何用 JavaScript 编写这个 if 语句? if(url == "http://www.google.com/" && "*") { ... } * 需要灵活并接受添加到第一个变量上
我知道 cPython 有一个 GIL,因此如果不使用多处理模块,您的脚本就无法在多个内核上运行。但是有什么可以阻止内置功能,例如使用多核进行排序吗?我不了解 cPython 结构,但我想我要问的问题
寻找命令行 gdb 的替代方法来检查 OSX 上的核心转储 - 有没有办法让 Xcode 打开带有调试符号的任意核心转储? 最佳答案 您是否尝试过使用 MachOView 1? 听起来它可能适用于查看
我是一名优秀的程序员,十分优秀!