Как записать матрицу в файл python
Изучаю 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 это будет работать?
Регистрация: 23.10.2010
Сообщений: 2,269
Редактировать свой пост видимо поздно.
ОС 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)
И это работает хорошо.
Но при чтении такого файла надо заранее знать из чего же он был сделан .
Возможно, что я сильно не .
Возможно, что этот метод, хотя и позиционируется как для сохранения в текстовом файле, так и не должен работать?
В этом я сильно сомневаюсь. Но я новичок и .
Как считать матрицу из файла и занести в массив на python?
Всем добрый день! Подскажите пожалуйста как решить задачку на python: есть текстовый файл mmm.txt, в нем матрица (5 строчек, 5 столбцов) из чисел типа float. Надо считать этот файл, занести в массив и далее преобразовать этот массив: все числа, которые больше 10.0, заменить на 0.0.
- Вопрос задан более трёх лет назад
- 2037 просмотров
3 комментария
Оценить 3 комментария

Пишите код
Когда будут неясности — задавайте вопрос
Задача слишком простая, чтоб за вас ее делать
Я добрее гражданина что прокомментировал выше, поэтому помогу вам составить запросы в гугл.
1. Как считать текстовый файл Python
2. Что такое list Python
3. Что такое for Python
Если сложить ответы на эти вопросы получится решение вашей задачи.

HobbitXX @HobbitXX Автор вопроса
Большое вам спасибо за ответ! Считать файл получилось. Теперь проблема в следующем: нужно преобразовать строки в числа, но почему-то не получается. Текст программы:
from array import array
f = open(‘sn1.txt’)
a = f.read()
print(a)
f.close()
for i in range(len(a)):
a[i] = int(a[i])
Выдается ошибка: ‘str’ object does not support item assignment
(в файле ‘sn1.txt’ сейчас просто одна строка: 1 2 3 4 5)
Видимо, преобразовывать нужно несколько иначе?
Проблема Как вывести матрицу любого размера в текстовом файле?
а чем отличается функция вывода данных на экран от функции вывода данных в файл? Параметрами функции?
на сколько я помню, мы с тобой уже «рисовали» матрицу любого размера на экране, дк выведи ее теперь в файл, передав все значения в класс
public class MatrixF < public static void main(String args[])throws IOException < File file = new File("C:\Users\Nastya\Desktop\matrixF.txt"); // Создание файла file.createNewFile(); // Создание объекта FileWriter FileWriter writer = new FileWriter(file); // Запись содержимого в файл writer.write("Матрица nxm"); // цикл вывода значений в writer.write writer.flush(); writer.close();
Ты умная девченка, иначе я бы тебе не помагал. Выполняй
пс кстати не забудь import java.io.*;
Последнее редактирование: 08.08.2018
nastya2018
а чем отличается функция вывода данных на экран от функции вывода данных в файл? Параметрами функции?
на сколько я помню, мы с тобой уже "рисовали" матрицу любого размера на экране, дк выведи ее теперь в файл, передав все значения в класс
public class MatrixF < public static void main(String args[])throws IOException < File file = new File("C:\Users\Nastya\Desktop\matrixF.txt"); // Создание файла file.createNewFile(); // Создание объекта FileWriter FileWriter writer = new FileWriter(file); // Запись содержимого в файл writer.write("Матрица nxm"); // цикл вывода значений в writer.write writer.flush(); writer.close();
Ты умная девченка, иначе я бы тебе не помагал. Выполняй
Спасибо вам большое))) ценю вас)
nastya2018
Надо бы поскорей забрать свой ноутбук из ремонта, одолжила ноутбук у однокурсника
nastya2018
Надо бы поскорей забрать свой ноутбук из ремонта, одолжила ноутбук у однокурсника
Из из этого меня не было на форуме так долго)
m0nstr
Green Team
19.06.2018 95 71
Попробуй так
public class Matrix < public static void main(String[] args) < try(FileWriter writer = new FileWriter("C:\Users\Nastya\Desktop\matrixF.txt", false)) < // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('\n'); writer.append('E'); writer.flush(); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
nastya2018
Попробуй так
public class Matrix < public static void main(String[] args) < try(FileWriter writer = new FileWriter("C:\Users\Nastya\Desktop\matrixF.txt", false)) < // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('\n'); writer.append('E'); writer.flush(); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Извините что вас достаю, как туда можно записать матрицу m n чтобы выводило матрицу любого размера ( я писала код но не получается.
Можете пожалуйста написать, я прочитаю код и пойму как это делается( буду вам очень благодарна )))))
m0nstr
Green Team
19.06.2018 95 71
я прочитаю код и пойму как это делается
я писала код но не получается
мы разбираемся вместе, а не пользуемся готовыми. это же не в магазин сходить. делаем все сами
nastya2018
мы разбираемся вместе, а не пользуемся готовыми. это же не в магазин сходить. делаем все сами
package matrix; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class MatrixF < public static void main(String[] args) < try (FileWriter writer = new FileWriter("C:\Users\Nastya\Desktop\matrixF.txt", false)) < ; System.out.print("Enter M:"); int m = scanner.nextInt(); System.out.print("Enter N:"); int n = scanner.nextInt(); Matrix matrix = new Matrix(m, n); for (int x = 0; x < m; x++) < for (int y = 0; y < n; y++) < System.out.print("Enter matrix[" + x + "][" + y + "]:"); matrix.put(x, y, scanner.nextInt()); String text = ""; writer.write(text); writer.append('\n'); writer.append('E'); writer.flush(); >catch (IOException ex) < System.out.println(ex.getMessage()); >> >
nastya2018
мы разбираемся вместе, а не пользуемся готовыми. это же не в магазин сходить. делаем все сами
Как сделать правильно?
Кстати нужно сначала создать метод writeMatrixToFile(m. filename) чтобы сохранять матрицу в файле
public static Matrix writeMatrixToFile(m, filename)
Как можно в нем сохранять файл
package matrix; import java.util.Random; import java.util.Scanner; public class MatrixUtils < public static void fillByRandom(Matrix m) < int rowCount = m.getRowCount(); int colCount = m.getColCount(); Random random = new Random(); for (int i = 1; i catch (MatrixIndexException e) < System.err.println(e.getMessage()); >> > > public static void fillByNumber(Matrix m, int number) < int rowCount = m.getRowCount(); int colCount = m.getColCount(); for (int i = 1; i catch (MatrixIndexException e) < System.err.println(e.getMessage()); >> > > public static Matrix fillByKeyboard() < Scanner scan = new Scanner(System.in); System.out.println("Enter The Number Of Matrix Rows:"); int rowCount = scan.nextInt(); System.out.println("Enter The Number Of Matrix Columns:"); int colCount = scan.nextInt(); try < Matrix2D m = new Matrix2D(rowCount, colCount); System.out.println("Enter Matrix Data:"); for (int i = 1; i > return m; > catch (MatrixIndexException ex) < System.err.println(ex.getMessage()); >return null; > public static Matrix MatrixMultiple(Matrix a, Matrix b) throws MatrixIndexException < int aRows = a.getRowCount(); int aColumns = a.getColCount(); int bRows = b.getRowCount(); int bColumns = b.getColCount(); if (aColumns != bRows) < throw new IllegalArgumentException("A:Rows: " + aColumns + " did not match B:Columns " + bRows + "."); >Matrix2D c = new Matrix2D(aRows, bColumns); for (int i = 0; i < aRows; i++) < for (int j = 0; j < bColumns; j++) < c.put(i+1,j+1,0); >> for (int i = 0; i < aRows; i++) < for (int j = 0; j < bColumns; j++) < for (int k = 0; k < aColumns; k++) < c.put(i+1,j+1,c.get(i+1,j+1) + a.get(i+1, k+1) * b.get(k+1, j+1)); >> > return c; > public static Matrix writeMatrixToFile(m, filename) < >>
m0nstr
Green Team
19.06.2018 95 71
пс кстати не забудь import java.io.*;
алгоритм примерно такой: создаешь класс работы с файлами, и вызываешь его в цикле каждый раз, вместо того чтобы выводить на экран, передавая переменные в него. файл будет записан построчно. либо запиши весь вывод данных в массив какой-нибудь и передай разом. включай голову )
nastya2018
мы разбираемся вместе, а не пользуемся готовыми. это же не в магазин сходить. делаем все сами
Я правильно написала?
public static Matrix writeMatrixToFile(m, filename) < File file = new File("Test.txt"); >try (FileWriter filewriter = new FileWriter("Test.txt")) < for (int i=0;i<3;++i) for (int j=0;j<3;++j) filewriter.write(massiv[i][j]); filewriter.flush();
m0nstr
Green Team
19.06.2018 95 71
я не ява-программист (как уже говорил), но судя по всему где-то ошибка. но направление правильное
sinner67
Green Team
24.03.2017 279 357
Я бы так сделал:
import org.json.simple.JSONArray; import org.json.simple.JSONValue; /* пусть есть матрица */ int[][] m = new int[5][5]; /**это просто для заполнения матрицы*/ int count = 0; /**заполняем матрицу*/ for (int i = 0; i < m.length; i++) for (int j = 0; j < m.length; j++)< m[i][j] = count++; >/*создаем джейсон массив*/ JSONArray ar = new JSONArray(); /*преобразуем нашу матрицу в джейсона*/ for (int i = 0; i < m.length; i++)< JSONArray newAr = new JSONArray(); for (int j = 0; j < m.length; j++)< newAr.add(m[i][j]); >ar.add(newAr); > /*преобразуем джейсон массив в строку, далее ее используем как хотим например для записи в файл, как тебе и нужно, причем в один файл можно записать кучу матриц удобно на мой взгляд */ String jsonStr = ar.toJSONString(); /*просто проверка работы*/ System.out.println(jsonStr); /*далее обратный процесс*/ /*получаем строку джейсона и преобразуем ее в джейсон массив*/ JSONArray toJson = (JSONArray) JSONValue.parse(jsonStr); /*заполняем нашу матрицу из джейсон массива*/ int[][] newM = new int[5][5]; for (int i = 0; i < newM.length; i++)< String str = toJson.get(i).toString(); /*тут сначала получаем построчно*/ JSONArray tmp = (JSONArray)JSONValue.parse(str);/*тут преобразовуваем полученную строку еще в один джейсон массив*/ for (int j = 0; j < newM.length; j++)< System.out.println(Integer.valueOf(tmp.get(j).toString()));/*это просто для проверки*/ newM[i][j] = Integer.valueOf(tmp.get(j).toString()); /*заполняем нашу матрицу*/ >> /*это для проверки результата*/ for (int i = 0; i < newM.length; i++)< for (int j = 0; j < newM.length; j++)< System.out.print(String.valueOf(newM[i][j]) + " "); >System.out.println(); >
Про джейсон достаточно прочитать тут:
Ссылка скрыта от гостей
Джейсон библиотеку прикрепил.
Этот вариант для того, что бы "подумать"))
Если буду вопросы задавай.
Если вриант для тебя подходит и буду трудности, потом помогу подделать под твоую проблему его.
Но советую самой разобраться.
Можешь прям так вставить код в новый проект, подключить библиотеку и покрутить все это.
Вложения
json-simple-1.1.1.jar.zip
20,5 КБ · Просмотры: 206
nastya2018
Я бы так сделал:
import org.json.simple.JSONArray; import org.json.simple.JSONValue; /* пусть есть матрица */ int[][] m = new int[5][5]; /**это просто для заполнения матрицы*/ int count = 0; /**заполняем матрицу*/ for (int i = 0; i < m.length; i++) for (int j = 0; j < m.length; j++)< m[i][j] = count++; >/*создаем джейсон массив*/ JSONArray ar = new JSONArray(); /*преобразуем нашу матрицу в джейсона*/ for (int i = 0; i < m.length; i++)< JSONArray newAr = new JSONArray(); for (int j = 0; j < m.length; j++)< newAr.add(m[i][j]); >ar.add(newAr); > /*преобразуем джейсон массив в строку, далее ее используем как хотим например для записи в файл, как тебе и нужно, причем в один файл можно записать кучу матриц удобно на мой взгляд */ String jsonStr = ar.toJSONString(); /*просто проверка работы*/ System.out.println(jsonStr); /*далее обратный процесс*/ /*получаем строку джейсона и преобразуем ее в джейсон массив*/ JSONArray toJson = (JSONArray) JSONValue.parse(jsonStr); /*заполняем нашу матрицу из джейсон массива*/ int[][] newM = new int[5][5]; for (int i = 0; i < newM.length; i++)< String str = toJson.get(i).toString(); /*тут сначала получаем построчно*/ JSONArray tmp = (JSONArray)JSONValue.parse(str);/*тут преобразовуваем полученную строку еще в один джейсон массив*/ for (int j = 0; j < newM.length; j++)< System.out.println(Integer.valueOf(tmp.get(j).toString()));/*это просто для проверки*/ newM[i][j] = Integer.valueOf(tmp.get(j).toString()); /*заполняем нашу матрицу*/ >> /*это для проверки результата*/ for (int i = 0; i < newM.length; i++)< for (int j = 0; j < newM.length; j++)< System.out.print(String.valueOf(newM[i][j]) + " "); >System.out.println(); >
Про джейсон достаточно прочитать тут:
Ссылка скрыта от гостей
Джейсон библиотеку прикрепил.
Этот вариант для того, что бы "подумать"))
Если буду вопросы задавай.
Если вриант для тебя подходит и буду трудности, потом помогу подделать под твоую проблему его.
Но советую самой разобраться.
Можешь прям так вставить код в новый проект, подключить библиотеку и покрутить все это.
Чтение матрицы из файла.
Здравствуйте! Мне нужно прочитать матрицу из файла input.txt на языке python3. Матрица состоит из char'ов и вот ее пример:
A A . B B . A . . B A A . . B A . . . B A A . B B на вход еще подаются два числа n*m (размерность матрицы) Пробовал гуглить . Ничего не нашел. Кто знает как реализовать чтение матрицы пожалуйста помогите.

levon12341
08.10.16 12:23:09 MSK
подписался, тоже интересно.. сталкнулся с такой же проблемой когда вдруг оказалось нужно прочитать матрицу из файла и ни как.
anonymous
( 08.10.16 12:31:44 MSK )
Ответ на: комментарий от anonymous 08.10.16 12:31:44 MSK

ты больной ублюдок если не знаешь не пиши
levon12341
( 08.10.16 12:34:13 MSK ) автор топика
Ответ на: комментарий от anonymous 08.10.16 12:31:44 MSK

Подписавшийся анонимус. Смотри в личке решение.
greenman ★★★★★
( 08.10.16 12:34:16 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK

скинешь мне решение??
levon12341
( 08.10.16 12:36:02 MSK ) автор топика

Vovanano ★
( 08.10.16 12:36:18 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK
Спасибо, для моих задач подходит. Кинул 30$ на кошелёк, как договаривались.
anonymous
( 08.10.16 12:37:07 MSK )
Ответ на: комментарий от greenman 08.10.16 12:34:16 MSK
да, спасибо! решение работает! матрицы прямо НА_УРА теперь читаются!
только исправил xrange на range — в тройке его нет
anonymous
( 08.10.16 12:37:40 MSK )
Ответ на: комментарий от levon12341 08.10.16 12:36:02 MSK
anonymous
( 08.10.16 12:39:26 MSK )

Читай по строкам, пользуйся .split() для разделения по пробелам.
evilface ★★
( 08.10.16 13:05:00 MSK )

Для начала считай файл в массив текстовых строк.
Затем по формуле s = (2*m)-1 ты получишь позицию символа в строке.
Но лучше сделай следующим образом. Могу показать пример на gambas, но думаю для питона ты сможешь его адаптировать
Dim FileStrings As String[] ' Динамический массив строк Dim MATRIX As New Byte[][] ' Массив массивов. Двумерный массив для результата Dim a As Integer ' счётчик Dim b As Intrger Dim e As Intrger Dim m As Integer ' предел счётчика Dim sm As Integer ' предельная строка Dim t As String * 1 FileStrings = LoadDataTextFile() ' Загрузка строк из файла в массив MATRIX.Resize(FilesStrings.Count) ' Размер матрицы по количеству строк sm = MATRIX.Max For a=0 To sm Matrix[a] = New Byte[] m = Len(FileStrings[a]) Matrix[a].Resize(m/2) b = 1 For e=0 To Matrix[a].Max MATRIX[a][e] = Asc(Mid(FileStrings[a],b,1)) b=b+2 Next Next