Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2017, 10:25   #1
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию NumPy и чтение/запись массива в файл

Изучаю Python.
ОС Winows 10 (64)
Python 3.6.1
NumPu 1.12.1 ставил через pip.

При работе с модулем NumPy столкнулся с такой проблемой:
При записи массива в текстовый файл (5 строк, 2 столбца):
Код:
fhou = open(ouf, 'wt')
np.savetxt(fhou, MyMatr, fmt='% .5f')
Выдается сообщение вида:
TypeError: Mismatch between array dtype ('float64') and format specifier ('% .5f % .5f')
В сети нашел ответ (годичной давности), из которого следует, что файл следует открывать в бинарной моде или перейти на NumPy 1.11.1:
Код:
fhou = open(ouf, 'wb')
np.savetxt(fhou, MyMatr, fmt='% .5f')
Попробовал. Да, работает, но массив пишется строкой, без разбивки на столбцы (как бы хотелось).
Возможно кто то решал этот вопрос?
Поделитесь информацией.
И да, в NumPy 1.11.1 это будет работать?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.05.2017, 11:44   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Редактировать свой пост видимо поздно.
ОС Winows 10 (64)
Перепроверил и переустановил Python.
Была установлена 32-бит версия. Установил 64-бит.
Теперь:
Python 3.6.1 (64-bit)
NumPu 1.13.0 (64-bit)

При записи матрицы (например, массив 3х3) в текстовый файл, если файл открыт как текстовый:
Код:
fhou = open(ouf, 'wt')
np.savetxt(fhou, MyMatr)
Как и прежде выдается сообщение вида:
TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e %.18e %.18e')
Так получается, что мой массив имеет тип float64, и этот тип не совпадает с заданным по умолчанию.
Но если изменить тип данных на другой - такая же фигня.

Ответ в сетях годичной давности...
В нем рекомендуют открывать файл в бинарной моде.
Код:
fhou = open(ouf, 'wb')
np.savetxt(fhou, MyMatr)
И это по-прежнему работает в новых условиях.
Но дело в том, что данные записываются в одну строку, даже если задать параметр delimiter = '\n'.

И тут дело не в том, что можно писать через write() и формировать нужный вид в текстовом файле. Это просто и получается нормально.
Но вот в NumPy есть и такой вариант, когда можно инициализировать массив, прочитав данные из форматированного текстового файла. Например:
Код:
MyMatr1 = np.loadtxt(fh_i, dtype=np.float, ndmin = 1)
print(MyMatr1)
И это работает хорошо.
Но при чтении такого файла надо заранее знать из чего же он был сделан ...

Возможно, что я сильно не ...
Возможно, что этот метод, хотя и позиционируется как для сохранения в текстовом файле, так и не должен работать?
В этом я сильно сомневаюсь. Но я новичок и ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.05.2017, 11:52   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Да, работает, но массив пишется строкой, без разбивки на столбцы (как бы хотелось).
Как именно пишется? И чем вы смотрите? Может там просто \n без \r, а вы блокнотом открываете?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.05.2017, 12:24   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Да, смотрел Блокнотом.
Но вот конкретно:
Матрица 3х3 получена методом:
Код:
import numpy as np
Matr = (b-a)*np.random.random(size=(n,n)) + a
....
fh_o = open(file_o, 'wb')
np.savetxt(fh_o, MyMatr,fmt = ' %8.4f', delimiter = '\n' )
fh_o.close()
fh_o = open(file_o, 'wb')
np.savetxt(fh_o, MyMatr,fmt = ' %8.4f', delimiter = '\n' )
fh_o.close()
Результат во вложении:

Если смотреть FAR'ом, то там каждое число завершается символом 0A hex.
Это Line Feed и в FAR - это столбец, но не матрица, т.к. группа символов должна повториться через 3 числа, как бы ...
Ожидание вида в другом файле. Или я тут вновь что-то проглядел ...

PS:
Кажись начинаю вникать ...
Сделал так и получил, см. третье вложение.
np.savetxt(fh_o, MyMatr,fmt = ' %8.4f', delimiter = '\n\r' )
Если в FAR'e то ...
Буду думать ...

PSS:
И о ДА ... а ... а ...
Код:
np.savetxt(fh_o, MyMatr,fmt = ' %8.4f')
Пишет с нужной разбивкой, но без ...
Век учись ...
Спасибо за подсказку.
Вложения
Тип файла: txt tstNewNumPy.txt (90 байт, 170 просмотров)
Тип файла: txt Wait2.txt (84 байт, 166 просмотров)
Тип файла: txt tstNewNumPy1.txt (96 байт, 141 просмотров)
Как-то так, ...

Последний раз редактировалось ViktorR; 12.05.2017 в 12:43.
ViktorR вне форума Ответить с цитированием
Старый 12.05.2017, 12:46   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
\n\r
\r\n или открывать в нормальном редакторе надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.05.2017, 13:09   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Обида берет за то, что потратил много времени и что ведь все это знал.
Да вот как придет беда ...
В подобную ситуацию раньше попадал, да вот видимо мало били
Не засело в кость мозга.
Да и delimiter другую роль играет - это разделитель между числами, в данной ситуации, а не символ, который разделяет строки.
Так что все заработало и без delimiter
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 08.09.2018, 00:41   #7
poili777
Новичок
Джуниор
 
Регистрация: 08.09.2018
Сообщений: 1
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Обида берет за то, что потратил много времени и что ведь все это знал.
Да вот как придет беда ...
В подобную ситуацию раньше попадал, да вот видимо мало били
Не засело в кость мозга.
Да и delimiter другую роль играет - это разделитель между числами, в данной ситуации, а не символ, который разделяет строки.
Так что все заработало и без delimiter
столкнулся с той же проблемой, просветите, в чем решение
poili777 вне форума Ответить с цитированием
Старый 08.09.2018, 12:21   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какой той же? И тут же написано в чем была проблема.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.09.2018, 15:40   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

poili777
Возможно вам поможет эта ссылка:
https://ru.wikipedia.org/wiki/%D0%9F...BE%D0%BA%D0%B8
Проблема была в моей голове, поскольку я знал, что в Windows и Linux символы завершения строки разные: \r\n для Windows и \n - для linux.
Есть "неправильные" редакторы, например Блокнот, который требует наличия обоих символов в конце строки.
Но, например, редактор в FAR или тот же WordPad уже правильно воспринимают ситуацию с комбинацией символов, которая завершает строку.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись в файл (С++) ura11_98 Помощь студентам 1 23.05.2016 19:13
Вопрос Сохранение массива в файл и чтение массива из файла vvzvlad Помощь студентам 2 05.11.2013 23:27
Запись и чтение символьного массива в файл/из файла (C++) Noyabr Помощь студентам 6 22.01.2012 13:59
Чтение/запись массива объектов в файл MrBrain Общие вопросы .NET 0 08.06.2010 10:44