проблемы с чтением и записью массива np из и в файл csv - PullRequest
0 голосов
/ 15 октября 2018

Это (отличное) продолжение вопроса I , опубликованного ранее .Мой предыдущий CSV-файл был плохо отформатирован, и @The Puternerd любезно предложил сгладить 2d-массив перед записью его в файл.

Итак, вот что у меня есть:

output = open(CSVFilepath,"w")

csvwriter=csv.writer(output, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)

for imagePath in glob.glob(MaskImagePath):
...
    #myDescriptor is the 2d np array with varying rows and fixed columns (60)
    myrow=[imageID,myDescriptor.shape[0],myDescriptor.flatten()]

Вот как выглядит мой CSV-файл:

000000216739.jpg,224,[0. 0. 0. ... 0. 1. 2.]
000000001268.jpg,173,[0. 0. 0. ... 0. 1. 0.]
000000166259.jpg,195,[0. 0. 0. ... 0. 0. 2.]
000000368900.jpg,226,[0. 0. 0. ... 1. 1. 1.]

Но когда я попытался получить третий элемент с помощью:

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

        for row in reader:
            print(row[2])
            print(type(row[2]))
            print(np.array(list(row[2])))

возвращает:

[0. 0. 0. ... 1. 3. 2.]
<class 'str'>
['[' '0' '.' ' ' '0' '.' ' ' '0' '.' ' ' '.' '.' '.' ' ' '1' '.' ' ' '3' '.' ' ' '2' '.' ']']

Значит ли это, что я не сохранил значения должным образом?Любой совет будет очень признателен !!!

********** Обновление **************

Чтение инструкций @Navneethниже, сейчас у меня есть этот код:

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

        for row in reader:
            print(row[2])
            print(type(row[2]))
            a = row[2].replace("\n","")
            print(a)
            print(np.fromstring(a[1:-1], dtype=float, sep=" "))

, но он печатает:

[0. 0. 0. ... 1. 2. 0.]
<class 'str'>
[0. 0. 0. ... 1. 2. 0.]
[0. 0. 0.]
[0. 0. 0. ... 1. 3. 2.]
<class 'str'>
[0. 0. 0. ... 1. 3. 2.]
[0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
<class 'str'>
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0.]

1 Ответ

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

Нет проблемы с кодировкой в ​​CSV-файл как таковой.Однако CSVReader не может распознать, что вы пытаетесь прочитать массив numpy из третьего столбца, поэтому он просто возвращает строковое представление этого массива numpy.

Причина, по которой ваш третий выводоператор дает вам странное форматирование в том, что использование numpy.array в строке приведет к тому, что numpy будет интерпретировать ее как массив отдельных символов (что естественно, так как эта функция будет разлагать любую итерацию на отдельные элементы, как если бы вы вызывали list("mystring")).

Вот один короткий способ интерпретации строки как массива с использованием numpy.fromstring.

def string_to_numpy(column):
  return numpy.fromstring(column[1:-1], dtype=float, sep=" ")

Соединение необходимо, потому что numpy.fromstring не ожидает [ и ] символов на входе.В этом вызове в качестве разделителя используется один пробел, хотя вы можете быть хитрее и использовать регулярные выражения, если этого недостаточно.

Обратите внимание, что полученный здесь массив плоский.Если вы хотите восстановить размерность массива, вам придется использовать numpy.array.reshape после извлечения измерений в виде целых чисел.

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