【发布时间】:2018-06-14 11:04:35
【问题描述】:
我正在尝试在时间序列上使用 R 包 tseriesChaos 中的互信息函数并找到第一个最小值,以确定时间序列延迟嵌入的最佳延迟。我编写了以下函数来完成此操作:
def determine_lag(tseries, plot):
numpser = numpy.asarray(tseries)
n = numpser.size
bins = 1 + math.log(n, 2)
z = 500
emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot))
x = emi[0]
it = numpy.nditer(emi)
while not it.finished:
y = it[0]
num = it.index
if y > x:
lag = num
break
else:
x = y
it.iternext()
else:
showwarning(title='Error', message='No minimum found, delay set to 50')
failed = True
lag = 50
return lag, failed
其中tseries 是由soundfile.read 在其他地方提取的时间序列,plot 是TRUE 或FALSE。
但是,当尝试使用该函数时,R 函数的参数转换似乎发生了错误。输出如下:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
return self.func(*args)
File "/Users/BrandonPlay/Soundbed 0.3/master.py", line 177, in Start
self.lag, failed = determine_lag(self.tseries, do_plot)
File "/Users/BrandonPlay/Soundbed 0.3/master.py", line 49, in determine_lag
emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot))
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 178, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 102, in __call__
new_args = [conversion.py2ri(a) for a in args]
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 102, in <listcomp>
new_args = [conversion.py2ri(a) for a in args]
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/numpy2ri.py", line 72, in numpy2ri
if not o.dtype.isnative:
AttributeError: 'float' object has no attribute 'dtype'
据我所知,当RPy2 中将参数转换为 R 对象以传递给 R 函数的函数遇到参数 z 时,就会发生此错误。当前设置,其中z 在函数调用之外分配,是为了修复错误;之前,我只是在函数调用中将数字声明为参数。
我真的不明白为什么参数转换器在处理简单的整数参数时会遇到困难,特别是因为 bins 也是一个整数并且处理得很好。
有人知道为什么会这样吗?
【问题讨论】:
-
请修正代码中的缩进。
-
emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot))出现错误,但您提供的有关tseriesChaos.mutual()的信息很少。您是否查看了文档:rpy2.github.io/doc/v2.9.x/html/…?
标签: python r python-3.x numpy rpy2