numpy.genfromtxt导入元组而非数组
我正在学习Python和Numpy,所以请多多包涵。我正在使用numpy.genfromtxt这个函数把一个CSV文件导入到一个矩阵中。这个CSV文件的内容如下:
Time(min),Nm,Speed,Power,Distance,Rpm,Bpm,interval,Altitude,Rate,Incline,Temp,PowerBalance,LeftTorqueEffectiveness,RightTorqueEffectiveness,getLeftPedalSmoothness,getRightPedalSmoothness,getCombinedPedalSmoothness,THb,SmO2,km
0.016666668,,4.3555064,0,0.002,0,118,1,684.3,0.0,0.0,14.71,50,-1.0,-1.0,-1.0,-1.0,-1.0,311.72,311.72
0.033333335,,4.3555064,20,0.002,0,119,1,684.3,0.0,0.0,14.71,50,-1.0,-1.0,-1.0,-1.0,-1.0,311.72,311.72
0.05,,4.444291,13,0.004,0,119,1,684.3,0.0,0.0,14.71,50,-1.0,-1.0,-1.0,-1.0,-1.0,311.72,311.72
现在我运行:
matrixCsv = np.genfromtxt(open(csvFile, "rb"), delimiter=',', \
missing_values=0,skip_header=1,dtype=float,\
usecols=(0,2,3,4,5,6,7,8,9,10,11,17),names=True)
然后我得到了:
[ (0.033333335, 4.3555064, 20.0, 0.002, 0.0, 119.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0)
(0.05, 4.444291, 13.0, 0.004, 0.0, 119.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0)
(0.06666667, 4.4781966, 16.0, 0.006, 0.0, 120.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0)
...,
看起来像是一些元组被放进了一个数组里。但是为什么是元组呢?我知道Numpy的数组或矩阵需要是同质的,也就是说里面的元素类型要一样,而Numpy会把不同类型的数据变成元组。但我的数据为什么会是不同类型的呢?我不太明白……
1 个回答
3
你可能对如何使用 skip_header
和 names
感到困惑。正确的读取数据的方法是使用第一行作为变量名,具体做法如下:
In [185]:
np.genfromtxt('temp.csv', delimiter=',', \
missing_values=0,skip_header=0,dtype=float,\
usecols=(0,2,3,4,5,6,7,8,9,10,11,17),names=True)
Out[185]:
array([ (0.016666668, 4.3555064, 0.0, 0.002, 0.0, 118.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0),
(0.033333335, 4.3555064, 20.0, 0.002, 0.0, 119.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0),
(0.05, 4.444291, 13.0, 0.004, 0.0, 119.0, 1.0, 684.3, 0.0, 0.0, 14.71, -1.0)],
dtype=[('Timemin', '<f8'), ('Speed', '<f8'), ('Power', '<f8'), ('Distance', '<f8'), ('Rpm', '<f8'), ('Bpm', '<f8'), ('interval', '<f8'), ('Altitude', '<f8'), ('Rate', '<f8'), ('Incline', '<f8'), ('Temp', '<f8'), ('getCombinedPedalSmoothness', '<f8')])
这里不是一个 tuple
的数组,而是一个 结构化数组
。使用 skip_header=1
会把数据的第一行当作名字,这可能不是你想要的(你会发现第一行的数据被跳过了,对吧?)。
你也可以不使用名字,直接把数据读取到一个普通的 numpy
array
中。
In [186]:
np.genfromtxt('temp.csv', delimiter=',', \
missing_values=0,skip_header=1,dtype=float,\
usecols=(0,2,3,4,5,6,7,8,9,10,11,17))
Out[186]:
array([[ 1.66666680e-02, 4.35550640e+00, 0.00000000e+00,
2.00000000e-03, 0.00000000e+00, 1.18000000e+02,
1.00000000e+00, 6.84300000e+02, 0.00000000e+00,
0.00000000e+00, 1.47100000e+01, -1.00000000e+00],
[ 3.33333350e-02, 4.35550640e+00, 2.00000000e+01,
2.00000000e-03, 0.00000000e+00, 1.19000000e+02,
1.00000000e+00, 6.84300000e+02, 0.00000000e+00,
0.00000000e+00, 1.47100000e+01, -1.00000000e+00],
[ 5.00000000e-02, 4.44429100e+00, 1.30000000e+01,
4.00000000e-03, 0.00000000e+00, 1.19000000e+02,
1.00000000e+00, 6.84300000e+02, 0.00000000e+00,
0.00000000e+00, 1.47100000e+01, -1.00000000e+00]])