Python - 将未知数据加载为n-dim矩阵

时间:2017-09-28 11:30:00

标签: python image machine-learning game-engine read-data

我有一个数据文件,包括未知棋盘游戏的“快照”,例如tictactoe / dama / chess / go..etc。 但我不知道游戏的参数,例如棋盘尺寸,棋子类型......等等

最简单的案例是tictactoe,所以我们以此为例。 片段和空字段表示为数字(-n,-n + 1 .. 0,+ n-1 .. + n ..)

开始:

  • 0 0 0
  • 0 0 0
  • 0 0 0

在这个简单的情况下,每次移动(x,O由1或-1表示,空字段为0)。最后,我将有一组由两条空行隔开的3x3矩阵。

如何将数据读入ndim数组([length_of_game] [board_width] [board_length] ,而无需手动添加任何有关bor / length大小的信息 游戏?

我只知道我有一个尺寸未知的棋盘,不同的棋子用不同的数字表示,快照代表游戏的演变。

1 个答案:

答案 0 :(得分:1)

您可以这样做的一种方法是逐行解析文件。用空格分割线(假设一行中的数字用空格分隔)并将结果列表添加到另一个列表中(让我们称之为current_game),它将保存所有行(行数据)。遇到空行时,可以将current_game列表添加到另一个列表中(让我们称之为游戏),这将保留所有游戏。

以下是一个示例函数:

def parse_data_file(file_path):
    games = []
    current_game = []
    with open(file_path, mode='r',) as file_reader:
        for line in file_reader:
            if len(line.strip()) == 0:
                if len(current_game) > 0:
                    # A empty new line, so the current game has finished. Add the current game to the games.
                    games.append(current_game)
                    current_game = []
            else:
                current_game.append(line.strip().split())

    return games

该函数检查当前行长度是否大于0,如果是,则首先对其进行条带化处理(从行尾除去任何空格),然后用空格分割它。您可以阅读有关拆分函数here的更多信息。如果行长度等于0,并且current_game长度大于0(此检查是在游戏列表中仅添加一次current_game),它会将列表添加到游戏列表中,并将其设置为新的空列表。

如果要将列表中的字符串强制转换为整数,则可以在拆分行时使用map函数。以下是将字符串转换为整数的相同代码:

def parse_data_file(file_path):
    games = []
    current_game = []
    with open(file_path, mode='r',) as file_reader:
        for line in file_reader:
            if len(line.strip()) == 0:
                if len(current_game) > 0:
                    # A empty new line, so the current game has finished. Add the current game to the games.
                    games.append(current_game)
                    current_game = []
            else:
                current_game.append(map(lambda item: int(item), line.strip().split()))

    return games

最后,要在numpy ndim数组中强制转换列表,可以使用numpy中的array函数。 这个解决方案假设在最后一个游戏之后,会有两个空行,但很容易改变它。