什么时候应该使用numpy.genfromtxt而不是pandas.read_csv来读取csv文件?

时间:2019-01-01 17:55:56

标签: python pandas numpy

我最近正在从.csv文件中提取图像,该文件包含名为 pixels 的列,并以字符串形式给出了48x48的值,因此通常会看到我使用的.csv文件pandas.read_csv 尝试将像素列转换为稍后在图像上转换为 PIL图像。

import pandas as pd
data = pd.read_csv('fer2013.csv') # fer2013 competition dataset.
data.head()

        emotion pixels  Usage
    0   0   70 80 82 72 58 58 60 63 54 58 60 48 89 115 121...   Training
    1   0   151 150 147 155 148 133 111 140 170 174 182 15...   Training
    2   2   231 212 156 164 174 138 161 173 182 200 106 38...   Training
    3   4   24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1...   Training
    4   6   4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84...

但是,我看到另一个人使用numpy.genfromtxt从讨论中加载csv文件:

data = np.genfromtxt('fer2013.csv',delimiter=',',dtype=None)

但是,我不明白numpy.genfromtxt的用途是什么,我也看到了scipy numpy.genfromtxt文档上的示例,

  

我发现 dtype命名方法很棒,但是可以使用   在pd.read_csv中也是如此!

np.genfromtxt

如果有人可以解释 numpy.genfromtxt 加载方法的必要性和使用方法,以及在读取文件的其他方法的基础上又有什么帮助,那将是很棒的事情。

您可以在此处找到数据: fer2013 competition Kaggle

2 个答案:

答案 0 :(得分:1)

据我了解,pandas阅读器是用C编写的优化程序,在很多情况下速度更快。 genfromtext是一种古老的python功能,具有较低的推断能力,如果您有熊猫,您会忘记的。

In [45]: df=pd.DataFrame(np.arange(10**6).reshape(1000,1000))

In [46]: df.to_csv("data.csv")

In [47]: %time v=np.genfromtxt("data.csv",delimiter=',',dtype=int,skip_header=1)
Wall time: 5.62 s

In [48]: %time u=pd.read_csv("data.csv",engine='python')
Wall time: 3.97 s

In [49]: %time u=pd.read_csv("data.csv")
Wall time: 781 ms

docs描述了engine选项:

  

engine:{‘c’,‘python’},可选

     

要使用的解析器引擎。 C引擎更快,而python引擎更快   目前功能更完善。

答案 1 :(得分:1)

我无法下载链接的数据集,但尝试从您的标题重新创建它:

In [2]: cat stack53997674.csv
emotion, pixels,  Usage
0,   "70 80 82 72 58 58 60 63 54 58 60 48 89 115 121",   Training
0,   "151 150 147 155 148 133 111 140 170 174 182 15",   Training
2,   "231 212 156 164 174 138 161 173 182 200 106 38",   Training
4,   "24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1",   Training
6,   "4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84",   Testing

与大熊猫一起

In [11]: df = pd.read_csv("stack53997674.csv")
In [12]: df
Out[12]: 
   emotion     ...             Usage
0        0     ...          Training
1        0     ...          Training
2        2     ...          Training
3        4     ...          Training
4        6     ...           Testing

[5 rows x 3 columns]
In [13]: df.dtypes
Out[13]: 
emotion     int64
 pixels    object
  Usage    object
dtype: object

values是2d对象dtype数组,在第二列中包含字符串:

In [20]: df.values[:,1]
Out[20]: 
array(['   "70 80 82 72 58 58 60 63 54 58 60 48 89 115 121"',
       '   "151 150 147 155 148 133 111 140 170 174 182 15"',
       '   "231 212 156 164 174 138 161 173 182 200 106 38"',
       '   "24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1"',
       '   "4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84"'],
      dtype=object)

使用genfromtxt

In [21]: data = np.genfromtxt("stack53997674.csv", delimiter=',', names=True, dt
    ...: ype=None, encoding=None, autostrip=True)
In [22]: data
Out[22]: 
array([(0, '"70 80 82 72 58 58 60 63 54 58 60 48 89 115 121"', 'Training'),
       (0, '"151 150 147 155 148 133 111 140 170 174 182 15"', 'Training'),
       (2, '"231 212 156 164 174 138 161 173 182 200 106 38"', 'Training'),
       (4, '"24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1"', 'Training'),
       (6, '"4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84"', 'Testing')],
      dtype=[('emotion', '<i8'), ('pixels', '<U48'), ('Usage', '<U8')])
In [23]: data['pixels']
Out[23]: 
array(['"70 80 82 72 58 58 60 63 54 58 60 48 89 115 121"',
       '"151 150 147 155 148 133 111 140 170 174 182 15"',
       '"231 212 156 164 174 138 161 173 182 200 106 38"',
       '"24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1"',
       '"4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84"'], dtype='<U48')

pixels是字符串dtype的一维数组。两者都可以与另一个dtype相互转换。两者都需要进行类似的处理才能生成图像。