Проблемы с чтением значений csv в массив 2d numpy

У меня проблемы с чтением значений из сохраненного файла 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 файлом)

Вот изображение файла данных:
Проблемы с чтением значений csv в массив 2d numpy

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

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 - это фактически количество [] строк (строк) в образе 000000216739.jpg. То, что я пытаюсь прочитать, - это массив формы 2d numpy (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.]]

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
341
2

Ответы 2

Я предполагаю, что ваши данные такие: 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

Привет @The Puternerd, большое спасибо за помощь. Но он дает эту ошибку: строка 27, в <module> nrows = int (row [1]) IndexError: индекс списка вне допустимого диапазона

Reine_Ran_ 15.10.2018 06:52

Я создал файл с именем testdata.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.]

The Puternerd 15.10.2018 06:56
import csv import numpy as np with open('testdata.csv') as f: reader = csv.reader(f,delimiter=',') for row in reader: fname=row[0] nrows=int(row[1]) imdata=np.array(row[2:]) С этим кодом все работает как положено. Данные соответствуют моим предположениям?
The Puternerd 15.10.2018 06:57

Похоже, что это то же самое ... Я также добавил изображение (снимок экрана) файла csv ... не уверен, что он такой же ...?

Reine_Ran_ 15.10.2018 07:00

В вашем примере кода вы ссылаетесь на строку [1], поэтому если вы удалите int из строки, изменит ли это что-нибудь? Ошибка говорит мне, что row [1] не существует, но вы сами ее использовали.

The Puternerd 15.10.2018 07:03

О нет ... похоже, что ошибка индекса списка вне допустимого диапазона все еще существует.

Reine_Ran_ 15.10.2018 07:09

Позвольте нам продолжить обсуждение в чате.

Reine_Ran_ 15.10.2018 07:11

поэтому, если вы напечатаете (row [1]), как в вашем коде, вы также получите ошибку вне индекса. Может быть, ваши данные отформатированы не так, как вы думаете - может быть, первая строка пуста и нет строк? Но, учитывая ваш пример, этот код на самом деле не сильно отличается.

The Puternerd 15.10.2018 07:13

Ваш файл не является правильным файлом 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 строк. Попробуйте запустить это.

Привет, @Rocky Li, большое спасибо за помощь. Могу я спросить, что вы имеете в виду под словом strip -> int () ..?

Reine_Ran_ 15.10.2018 06:53

Потому что я пробовал это: для row2 в матрице: output = [a for a in row2 if a.isnumeric ()] print (output), но он вернул мне пустые списки ...

Reine_Ran_ 15.10.2018 06:56

@ReineFang, который не будет работать, потому что вы будете смотреть на ' 10' и т. д., Это строки, поэтому a.isnumeric вернет false. Под полосой я имею в виду, что вы можете удалить пробелы с каждого из них с помощью a.replace(' ',''), а затем преобразовать его с помощью int(a).

Rocky Li 15.10.2018 14:59

Мне очень жаль, но не могли бы вы обновить приведенный выше код? Я немного запутался ...

Reine_Ran_ 16.10.2018 03:38

@ReineFang Я пробовал, если все равно не работает, может быть, вы хотите прислать мне полный файл?

Rocky Li 16.10.2018 03:53

Это будет действительно здорово, но могу я спросить, как я могу послать вам ..?

Reine_Ran_ 16.10.2018 05:28

@ReineFang у вас есть ссылка на github?

Rocky Li 16.10.2018 05:31

Позвольте нам продолжить обсуждение в чате.

Reine_Ran_ 16.10.2018 06:13

Другие вопросы по теме