我正在尝试使用.txt文件格式化为python Grid中的矩阵。
这是我用来创建网格的类:
class Grid(object):
"""Represents a two-dimensional array."""
def __init__(self, rows, columns, fillValue = None):
self._data = Array(rows)
for row in xrange(rows):
self._data[row] = Array(columns, fillValue)
def getHeight(self):
"""Returns the number of rows."""
return len(self._data)
def getWidth(self):
"Returns the number of columns."""
return len(self._data[0])
def __getitem__(self, index):
"""Supports two-dimensional indexing with [][]."""
return self._data[index]
def __str__(self):
"""Returns a string representation of the grid."""
result = ""
for row in xrange(self.getHeight()):
for col in xrange(self.getWidth()):
result += str(self._data[row][col]) + " "
result += "\n"
return result
它使用另一个名为Array的类来构建一维数组并将其转换为二维数组。
代码:Grid(10, 10, 1)
将返回一个包含10行和10列的2D数组,网格中的每个数字都为1。
这是Array类
class Array(object):
"""Represents an array."""
def __init__(self, capacity, fillValue = None):
"""Capacity is the static size of the array.
fillValue is placed at each position."""
self._items = list()
for count in xrange(capacity):
self._items.append(fillValue)
def __len__(self):
"""-> The capacity of the array."""
return len(self._items)
def __str__(self):
"""-> The string representation of the array."""
return str(self._items)
def __iter__(self):
"""Supports traversal with a for loop."""
return iter(self._items)
def __getitem__(self, index):
"""Subscript operator for access at index."""
return self._items[index]
def __setitem__(self, index, newItem):
"""Subscript operator for replacement at index."""
self._items[index] = newItem
我希望1是我所拥有的文本文件中的值,如下所示:
9 9
1 3 2 4 5 2 1 0 1
0 7 3 4 2 1 1 1 1
-2 2 4 4 3 -2 2 2 1
3 3 3 3 1 1 0 0 0
4 2 -3 4 2 2 1 0 0
5 -2 0 0 1 0 3 0 1
6 -2 2 1 2 1 0 0 1
7 9 2 2 -2 1 0 3 2
8 -3 2 1 1 1 1 1 -2
9,9表示矩阵的行和列。我可以使用列表的唯一地方是方法readline().split()
,它将第一行转换为列表。
当然我有线;
m = open("matrix.txt", "r")
data = m.read
其中数据返回字符串表示中的数字,因为它们是从文件夹格式化的,但我需要一些方法来单独返回每个数字并将其设置为网格中的单元格。有什么想法吗?
编辑:我的当前代码:
g = map(int, m.readline().split())
data = m.read()
matrix = Grid(g[0], g[1], 1)
g [0]和g [1]来自具有行和列变量的列表。这样,任何遵循相同格式的.txt文件都会使第一行成为行和列变量。 我试图弄清楚其余的数据如何在不使用列表的情况下替换“1”。
答案 0 :(得分:4)
这看起来如何:
with open('matrix.txt') as f:
grid_data = [i.split() for i in f.readlines()]
这将从文件中读取每个数组,将其格式化为值列表。
希望这有帮助!
答案 1 :(得分:1)
import numpy
a_width = 9
a_height = 9
data_file = "matrix.dat"
a = numpy.array(open(data_file).read().split(),dtype=int).reshape((a_width,a_height))
#or another alternative below
a = numpy.fromfile("matrix.dat",dtype=int,sep=" ").reshape(9,9)
print a
不同的解决方案
with open(data_file) as f:
a = map(str.split,f)
print a
这只是Nick Burns Code的一个稍微简洁的版本
答案 2 :(得分:0)
一个超简单的答案(添加了一个新答案,因为它比预先简单得多)
# create a grip object
new_matrix = Grid(9, 9)
with open('matrix.txt') as f:
# loop through the data
for i, line in enumerate(f.readlines()):
line = line.split()
# populate the new_matrix
for j, value in enumerate(line):
new_matrix[i][j] = value
我喜欢它使用Grid类来填充矩阵。除了从文件中读取数据外,没有使用列表。
到达那里(我希望,我想!)