numpy.polyfit显示TypeError:+不支持的操作数类型+:'numpy.ndarray'和'float'

时间:2015-05-13 18:50:34

标签: arrays numpy

所以我试图拟合来自.csv文件的一些数据的曲线,该文件有两个变量(列),称为'angle'和'velocity'(参见代码)。我尝试在数据数组上使用numpy.polyfit

但是代码给了我这个错误

  

TypeError:+:'numpy.ndarray'和'float'

不支持的操作数类型

数据集('angle'和'velocity')都是数组。

以下是代码:

import csv as csv
import pylab as plt
import numpy as np

readdata = csv.reader(open("stuff.csv"))

data = []

for row in readdata:
    data.append(row)     #add(append) row stuff in a variable called 'data'

header = data[0]
data.pop(0)
angle = []
velocity = []
for i in range(len(data)):
    angle.append(data[i][0])
    velocity.append(data[i][1])

#print (angle, velocity)

"""
result = lowess(angle, velocity)
print (result)
plt.plot(angle,result, '+')
plt.show()
"""

z = np.polyfit(angle, velocity, 3)    # The problem is right here 
f = np.poly1d(z)

angle_new = np.linspace(angle[0], angle[-1], 50)
velocity_new = f(angle_new)

plt.plot(angle, velocity, angle_new, velocity_new)
plt.xlim(angle[0]-1, angle[-1]+1)
plt.show()

1 个答案:

答案 0 :(得分:2)

请注意,当NumPy数组有一个字符串dtype时,使用float添加会引发TypeError:

In [12]: np.asarray([3], dtype='|S1') + 0.0
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'float'

当您从CSV文件中读取数据时,必须将字符串转换为数字值,否则您将把字符串加载到NumPy数组中。

您可以在此处使用float解决问题:

for i in range(len(data)):
    angle.append(float(data[i][0]))
    velocity.append(float(data[i][1]))

更有效的解决方案是使用np.loadtxtnp.genfromtxt将csv数据直接加载到NumPy数组中,而不是使用csv.reader。有关如何执行此操作的详细信息取决于csv文件的格式。