如何强制genfromtxt将csv读取为记录数组?
我正在尝试用以下代码读取CSV文件:
raw_data = genfromtxt(datafile,delimiter='\t',dtype=None)
好的,这个函数在遇到数据文件中的字符串数据时,会把文件读入记录数组。根据我的理解,当dtype设置为None时,文件也应该被读入记录数组,对吗?
但是,如果文件中没有字符串数据,只有数字数据,这个函数就会把数据读入ndarray(一个数组类型)。
如果不是,有没有简单的方法强制这个函数把文件读取为记录数组呢?
问题在于ndarray不适合我,因为我所有的代码都是为了处理记录数组而写的。
更新1:
如果有人想尝试这样做,这里有一个简单的解决方案。可能这不是最好的方法,但至少可以用:
从CSV文件读取数据为ndarray:
raw_data = genfromtxt(datafile,delimiter='\t',dtype=None)
为列生成默认的名称和数据类型:
names_=['f'+str(i) for i in range(raw_data.shape[1])];
names=[(name,raw_data.dtype) for name in names_];
最后,创建记录数组:
raw_data_as_ra = raw_data.ravel().view(names);
1 个回答
3
你可以使用 recfromcsv
,它是从 genfromtxt 衍生出来的,来处理你的数据文件:
如果你的文件内容是这样的:
col1,col2,col3
1.1, 2.4, 3.2
4.1, 5.2, 6.3
那么你可以这样做:
a = np.recfromcsv('yourfile.csv')
这样会得到:
rec.array([(1.1, 2.4, 3.2), (4.1, 5.2, 6.3)],
dtype=[('col1', '<f8'), ('col2', '<f8'), ('col3', '<f8')])
注意,recfromcsv
会把第一行当作列名或记录名。
另外,你可以使用和 genfromtxt
一样的输入参数(比如 delimiter
参数)。如果你的文件是用制表符分隔的,你的代码可能看起来像这样:
np.recfromcsv(datafile,delimiter='\t'))