使用scipy计算卷积时的ValueError

时间:2013-07-03 08:41:52

标签: python convolution

from scipy import ndimage
import numpy as np

with open("Data.dat", "r+") as f:
    content = f.readlines()
    content = [s.strip() for s in content]
    content = np.asarray(content)
    weights = np.array([1, 2, 4, 2, 1])
    final = np.empty(content)
    ndimage.filters.convolve1d(content, weights, -1, final, 'reflect', 0.0, 0.0)

此处npnumpy个包。 content的长度为750,因此尝试使用np.empty()初始化输出数组的形状,因为我不想要任何值。

但是当我跑步时,我得到了这个错误:

Traceback (most recent call last):
File "C:\Users\Animesh\Desktop\Smoothing.py", line 18, in <module>
final = np.empty(content)
ValueError: sequence too large; must be smaller than 32

应该做什么?

1 个答案:

答案 0 :(得分:2)

要使final为与content相同形状和dtype的空数组,请使用:

final = np.empty_like(content)

关于TypeError: integer argument expected, got float

虽然convolve1d的docstring说

origin : scalar, optional
    The `origin` parameter controls the placement of the filter.
    Default 0.0.

origin参数必须是整数,而不是浮点数。

这是一个没有错误运行的示例:

import scipy.ndimage as ndimage
import numpy as np

# content = np.genfromtxt('Data.dat')
content = np.asarray(np.arange(750))
weights = np.array([1, 2, 4, 2, 1])
final = np.empty_like(content)
ndimage.convolve1d(content, weights, axis=-1, output=final, mode='reflect', cval=0.0,
                   origin=0
                   # origin=0.0  # This raises TypeError
                   )
print(final)

取消注释origin=0.0会引发TypeError。


关于

with open("Data.dat", "r+") as f:
    content = f.readlines()
    content = [s.strip() for s in content]
    content = np.asarray(content)

这使content成为一个字符串数组。由于你正在进行卷积,你必须要一组数字。所以用

替换上面的内容
content = np.genfromtxt('Data.dat')