所以我试图拟合来自.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()
答案 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.loadtxt或np.genfromtxt将csv数据直接加载到NumPy数组中,而不是使用csv.reader
。有关如何执行此操作的详细信息取决于csv文件的格式。