2016-10-09 22 views
2

我有一個純文本文件(.txt),其中包含以下內容。如何從頭文件獲得整數的numpy ndarray?

Matrix Header. 
6 11 
0 1 1 1 1 1 1 1 1 1 1 
1 0 1 1 1 1 0 1 1 1 1 
1 1 1 1 0 0 1 1 1 1 1 
0 0 0 0 1 1 1 0 0 0 0 
1 1 1 0 0 1 1 1 1 1 1 
1 0 0 1 1 1 1 0 1 1 0 

6 rows, 11 columns 

我需要得到整數numpy的ndarray如下:

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

我嘗試以下策略

import pandas 
import numpy 
data = pandas.read_table(path, skiprows= 2) 
data = data.values 
print(data) 

但由此產生的ndarray是不正確的格式。

[['0 1 1 1 1 1 1 1 1 1 1 '] 
['1 0 1 1 1 1 0 1 1 1 1 '] 
['1 1 1 1 0 0 1 1 1 1 1 '] 
['0 0 0 0 1 1 1 0 0 0 0 '] 
['1 1 1 0 0 1 1 1 1 1 1 '] 
['1 0 0 1 1 1 1 0 1 1 0 ']] 

有人能幫助我嗎?

+0

您需要使用'九月=」「'在'read_table( )'。你也可以直接使用'numpy.load_txt()'。 – Julien

+0

您的輸入文件實際上是否包含底部的文本「6行,11列」? –

+0

工作正常,謝謝@JulienBernu。對更優雅高效的實施有什麼建議嗎? – HarpMan

回答

1

爲避免因末尾文字可能出現的錯誤,您可以使用numpy.genfromtxtmax_rows參數。例如,

In [26]: with open(filename, 'rb') as f: 
    ...:  f.readline() # skip the header 
    ...:  nrows, ncols = [int(field) for field in f.readline().split()] 
    ...:  data = np.genfromtxt(f, dtype=int, max_rows=nrows) 
    ...:  

In [27]: data 
Out[27]: 
array([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1], 
     [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1], 
     [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1], 
     [1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0]]) 

(我打開文件的二進制模式,以避免一個字節/ STR問題genfromtxt有在Python 3)

+0

謝謝沃倫。優秀的解決方 – HarpMan

1

一個簡單的解決方案是明確忽略你不需要的行:

with open(path) as infile: 
    lines = infile.readlines() 
np.loadtxt(lines[2:-2]) 
del lines # if you want to immediately release the memory 

這直接給你你想要什麼,假設頁眉和頁腳總是每兩行。

+0

謝謝約翰,工作正常。 – HarpMan