Когда я должен использовать numpy.genfromtxt вместо pandas.read_csv для чтения файла csv? - PullRequest
0 голосов
/ 01 января 2019

Я недавно делал часть извлечения изображения из файла .csv, файл содержал столбец с именем пикселей со значениями 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 конкурс Kaggle

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я не могу загрузить связанный набор данных, но попытался воссоздать его из вашего заголовка:

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 - это двухмерный объект типа dмассив со строками во 2-м столбце:

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 - это 1-й массив строки типа d.Оба могут быть преобразованы в / из другого dtype.И то и другое требует одинаковой обработки для получения изображений.

0 голосов
/ 01 января 2019

Насколько я понимаю, программа для чтения панд - это оптимизированная программа, написанная на 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

документы описывают параметр engine:

engine: {'c', 'python'}, необязательный

Механизм синтаксического анализатора для использования.Движок C работает быстрее, в то время как движок Python в настоящее время более полнофункциональный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...