我一直在努力加快粒子滤波器的重采样计算.由于python有很多方法可以加速它,我虽然会尝试所有这些.不幸的是,numba版本非常慢.由于Numba应该加速,我认为这是我的错误.
我尝试了4个不同的版本:
每个代码如下:
import numpy as np
import scipy as sp
import numba as nb
from cython_resample import cython_resample
@nb.autojit
def numba_resample(qs, xs, rands):
n = qs.shape[0]
lookup = np.cumsum(qs)
results = np.empty(n)
for j in range(n):
for i in range(n):
if rands[j] < lookup[i]:
results[j] = xs[i]
break
return results
def python_resample(qs, xs, rands):
n = qs.shape[0]
lookup = np.cumsum(qs)
results = np.empty(n)
for j in range(n):
for i in range(n):
if rands[j] < lookup[i]: …
Run Code Online (Sandbox Code Playgroud) 我编写了一个函数库,使我的工程作业更容易,并在python解释器中使用它们(有点像计算器).一些返回矩阵,一些返回浮点数.
问题是,它们返回太多小数.例如,目前,当一个数字为0时,我得到一个非常小的数字作为回报(例如6.123233995736766e-17)
我知道如何单独格式化输出,但这需要为我在解释器中键入的每一行添加格式化程序.我正在使用python 2.6.
有没有办法为会话设置全局输出格式(精度等)?
*注意:对于scipy功能,我知道我可以使用
scipy.set_printoptions(precision = 4, suppress = True)
Run Code Online (Sandbox Code Playgroud)
但这对于不使用scipy的函数似乎不起作用.
我有一个对象,它接受一个函数名func,args和kwargs,并在某些时候运行
func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
问题是,如果func不需要args/kwargs,则args/kwargs默认为None,这会导致TypeError.例如,如果函数不需要参数,则args,kwargs默认为None:
def test():
pass
args = None
kwargs = None
test(*args, **kwargs)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-b9618694fbf2> in <module>()
----> 1 test(*args, **kwargs)
TypeError: test() argument after ** must be a mapping, not NoneType
Run Code Online (Sandbox Code Playgroud)
我确定有一个很好的方法来解决这个问题,如果没有级联if语句检查是否存在args/kwargs,每个都有自己的函数调用,但我不知道如何.主要目标是将一个函数及其未知参数传递给一个对象,然后在一个方法中使用它们.
编辑:为了清晰起见添加了一个例子
>>> x = []
>>> y = [1,2,3]
>>> def func1(L):
... x+=L
...
>>> def func2(L):
... x.extend(L)
...
>>> func1(y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in func1
UnboundLocalError: local variable 'x' referenced before assignment
>>> func2(y)
>>> x
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
为什么列表extend()方法可以改变非全局变量,但+ =运算符不能?据我所知,只要函数没有赋值变量,它就可以在没有全局指定的情况下读取它.但在这种情况下,该函数确实设置了值.