Проблемы с чтением в CSV-значениях в 2d Numpy массив - PullRequest
0 голосов
/ 15 октября 2018

У меня проблемы с чтением значений из сохраненного CSV-файла.Это часть моего csv-файла:

000000216739.jpg, 224, [ 0.  0.  0.  0. 36. 44.  4.  0.  0.  0.  0.  0.  0.  0.  0.  0.  9. 14. 
8.  0.  0.  0.  0.  0.  0.  0.  0.  0.  7.  0.  3.  0.  0.  0.  0.  0.  
0.  0.  0.  0.  3.  1.  2.  0.  0.  0.  0.  0.  1.  0.  0.  1.  2.  0.  
3.  0.  0.  0.  0.  0.], 
[ 0.  0.  0.  0. 35. 33.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  9. 36.  ...]

(отформатированный в соответствии с имеющимся у меня csv-файлом)

Вот изображение файла данных:
enter image description here

Проблема в том, что я действительно не знаю, как читать каждую запятую отдельно.Когда I:

with open(CSVFilepath) as f:
    reader = csv.reader(f,delimiter=',')

    for row in reader:
        print(row)
        print(row[0])
        print(row[1])
        print(row[2])

возвращает:

['000000216739.jpg', '224', '[ 0.  0.  0.  0. 36. 44.  4.  0.  0.  0.  0.  0.  0.  0.  0.  0.  9. 14.']  
000000216739.jpg  
224   
[ 0.  0.  0.  0. 36. 44.  4.  0.  0.  0.  0.  0.  0.  0.  0.  0.  9. 14.   ]

Значение 224 на самом деле является числом [] s (строк) в изображении 000000216739.jpg.То, что я пытаюсь прочитать, - это двумерный массив фигуры (224, 60) с фиксированным значением 60 для всех изображений.

Итак, я пытаюсь прочитать следующее: например, для изображения 123.jpg (все в одном массиве формы (224 на 60):

[[ 0.  0.  0.  0. 36. 44.  4.  0.  0.  0.  0.  0.  0.  0.  0.  0.  9. 14.
  8.  0.  0.  0.  0.  0.  0.  0.  0.  0.  7.  0.  3.  0.  0.  0.  0.  0.
  0.  0.  0.  0.  3.  1.  2.  0.  0.  0.  0.  0.  1.  0.  0.  1.  2.  0.
  3.  0.  0.  0.  0.  0.],  
...  (more np arrays)...  
[ 6.  0.  0. 35. 64.  0.  0.  0.  0.  0.  0.  0. 20. 11. 27. 23.  5.  0.
  0.  0.  0.  0.  0.  0.  5.  0. 10.  1.  0.  0.  0.  0.  0.  0.  0.  0.
  6.  2.  3.  0.  0.  0.  0.  0.  0.  0.  0.  0.  2.  2.  1.  0.  0.  0.
  0.  0.  0.  0.  0.  0.]]

Могу ли я спросить, что мне делать ...? Кроме того, этот файл довольно большой, и мне нужен способ, чтобы прочитать его эффективно... Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Ваш файл не является правильным CSV-файлом, и вы не должны читать его как CSV-файл.

Разрыв строки в CSV-файле представляет новую строку, тогда как в вашем файле они не означаютчто - вы хотите прочитать числа внутри [ и ], но они не разграничены должным образом.

Способ разбить этот файл будет к

with open(file,'r') as fin:
    f = fin.readlines()
    f = ' '.join(f) # remove newlines
    listrows = f.split('[')
    listrows = [l.split(']')[0] for l in listrows] # Get string between '[' and ']'
    matrix = [row.split('.') for row in listrows] # This is now a 2D matrix
    final = [[int(e.replace(' ','')) for e in row] for row in matrix] # Here goes your final matrix

Я использовалПонимание списка широко, так что это не идет в 30 строк.Попробуйте запустить это.

0 голосов
/ 15 октября 2018

Полагаю, ваши данные таковы;filename, nrows, [imrow1], [imrow2], [imrow3], ..., [imrow_nrows] затем выполните следующее, чтобы извлечь изображение из ваших данных.Дайте нам знать, если ваши данные отформатированы по-разному.

with open(CSVFilepath) as f:
  reader = csv.reader(f,delimiter=',')

  for row in reader:
    fname=row[0]
    nrows=int(row[1])
    imdata=np.array(row[2:]) #Get from the 2 element to the end. Could also do row[:-nrows]
  #might need to make each element an int or float.        
  ###reshape if that's what you need and do something with the image
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...