2016-12-19 9 views
3

Мне дан текстовый файл, который имеет только 0 и 1 значения. Один пример:Преобразование 0 и 1 из текстового файла в 2-мерный массив

010 
111 
010 

Мне нужно принять эти значения и превратить их в 2-мерный массив. Таким образом, для примера, я должен получить массив так:

[[0,1,0] , [1,1,1], [0,1,0]] 

Каждый текстовый файл имеет другой номер столбца и ширины, так что моя программа должна быть в состоянии заботиться о различных размеров входных матриц. Я попробовал следующее:

numpy.loadtxt("file1.txt") 

Однако, это дает мне следующий выходной массив:

[ 10. 111. 10.] 

Любое руководство было бы здорово!

+0

Что вы написали как ваш желаемый результат, это список * python *. Вы хотите, чтобы массивы numpy были, правда? –

ответ

4

Не требуется numpy.readtext. Просто используйте встроенные обработчики файлов:

import numpy as np 
with open('file1.txt') as f: 
    arr = np.array([list(map(int, line.strip())) for line in f]) 
print(arr) 
+0

Спасибо вам большое! –

+0

@robertang - Возможно, вы хотели бы принять ответ? – aparente001

0

Yo также может сделать это без map магии.

import numpy as np 

with open('file1.txt') as f: 
    arr = np.array([[int(bin) for bin in line] for line in f]) 
print(arr) 
+0

Хотя я обычно предпочитаю понимание над 'map' и' filter', в случае сопоставления встроенной карты происходит быстрее, чем понимание, и, что более важно, она более читаема, чем вложенные. Но различия незначительны. –

1

Вы можете использовать np.genfromtxt для получения столбцов фиксированной ширины. параметр delimiter указывает ширину каждого столбца. Я использую dtype=np.int8, чтобы использовать наименьший след, поскольку OP сказал, что значения будут только нулевыми или единичными.

import numpy as np 

np.genfromtxt('file1.txt', delimiter=[1, 1, 1], dtype=np.int8) 

array([[0, 1, 0], 
     [1, 1, 1], 
     [0, 1, 0]]) 
+0

Я верю, что 'np.int0' дает слово' int'. Лучше всего использовать 'bool' или' np.int8' напрямую. –

+0

@ juanpa.arrivillaga спасибо – piRSquared