【问题标题】:scipy PchipInterpolator Error: 'array cannot be safely cast to required type'scipy PchipInterpolator 错误:'数组不能安全地转换为所需的类型'
【发布时间】:2013-12-27 11:57:18
【问题描述】:

我想对来自 pyaudio 的一些输入数据进行分段三次 Hermite 插值:

#input comes as string and is converted to int16
numpyData = numpy.fromstring(inData, dtype=numpy.int16)

#x positions of my y data
x = numpy.arange(len(numpyData))

#as i always want to interpolate to 4096 these are my indices
interpolationIndices = numpy.linspace(0, len(numpyData), num=4096, endpoint=False)

#my interpolator and print for testing
f = interpolate.PchipInterpolator(x, numpyData)
print f(interpolationIndices[0])

错误日志现在显示:

TypeError: array cannot be safely cast to required type

scipy.interpolate.PchipInterpolator 的文档说它应该是一个实数值数组,但我知道 int16 应该足够真实,而且我的 x-pos 数组也是单调排序的。

其他信息:

print numpyData

结果:

[3153 2362 5361 ..., 3206 -849 3241]  

所以所有整数值都符合预期。

完整的跟踪:

Traceback (most recent call last):  
File "/Users/myUser/Documents/workspace/myProject/AudioController.py", line 9, in callback  
return self.file.getAudio(frame_count, scaleMethod()), pyaudio.paContinue  
File "/Users/myUser/Documents/workspace/myProject/NewFileHandler.py", line 34, in getAudio
    data = self.resample(data)  
File "/Users/myUser/Documents/workspace/myProject/NewFileHandler.py", line 168, in resample
    f = interpolate.PchipInterpolator(x, numpyData)  
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 932, in __init__
    data[:,1] = PchipInterpolator._find_derivatives(xp, yp)  
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 982, in _find_derivatives
    PchipInterpolator._edge_case(mk[0],dk[1], dk[0])  
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 947, in _edge_case
    out[mask] = 1.0/(1.0/m0[mask]+1.0/d1[mask])  
TypeError: array cannot be safely cast to required type

numpyData.dtype:

int16

numpy 版本:

print numpy.__version__
1.6.2

scipy 版本:

print scipy.__version__
0.13.2

【问题讨论】:

  • @alko 上面添加的附加信息。 pyaudio 将 int16 数据打包成字符串,然后通过 numpy 将其转换为可用数据。由于 numpyData 是普通的 int16,我认为这不应该导致问题。

标签: python numpy scipy interpolation type-conversion


【解决方案1】:

绝对是一个错误(见底部),并且可以通过以下设置在 numpy 1.6.2 中重现:

import scipy.interpolate
import numpy as np
y = np.array([0,1,2], dtype=np.int16)
x = np.arange(len(y))

然后引发异常:

>>> np.__version__
1.6.2
# code skipped
>>> scipy.interpolate.PchipInterpolator(x, y)
Traceback (most recent call last):
    ...
    out[mask] = 1.0/(1.0/m0[mask]+1.0/d1[mask])
TypeError: array cannot be safely cast to required type

虽然 numpy 1.8.0 可以正常工作:

>>> np.__version__
1.8.0
# code skipped
>>> scipy.interpolate.PchipInterpolator(x, y)
<scipy.interpolate.polyint.PchipInterpolator object at 0x044371F0>

您的选择可能是升级 numpy。

附:这是一个布尔索引错误,在跟踪器中没有找到,下面是一个重现的简短示例:

out = np.array([0])
out[np.array([True])] = np.array([.5])

【讨论】:

  • 升级 numpy 解决了它。可悲的是,插值器非常慢,我必须找到另一种方法......谢谢!
  • @MaximilianKörner 随时提出您的实际任务和示例代码,如果需要,请寻求一种加快速度的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2019-09-19
  • 2010-10-11
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多