【问题标题】:how to read in boolean data file in Python with asarray function of numpy如何使用numpy的asarray函数在Python中读取布尔数据文件
【发布时间】:2013-08-25 11:36:51
【问题描述】:

我有一些包含 Fortran 代码的布尔输出的数据文件:

write(23,'(L2)') data

因此,文件的一部分将如下所示:

F F T F ...

我想用 numpy.asarray() 函数在 Python 中读取这个文件,因为这样转换数据很容易,例如:

data = asarray(f.readline().split(),'bool')

但是,无论是什么数据,Python 总是返回一个全为 'True' 的数组。

我也试过写成 'False False True False ...' 或 '0 0 1 0 ...',但它们都不起作用。

我想知道是否有办法使用 asarray() 来实现这一点?或任何其他可以在不使用循环的情况下转换布尔数据的建议?

【问题讨论】:

    标签: python arrays numpy boolean


    【解决方案1】:

    如果您可以将数据作为“T”和“F”字符串的数组读取,那么您可以执行以下操作:

    >>> a = np.array(["T", "F", "T"])
    >>> a == "T"
    array([ True, False,  True], dtype=bool)
    

    【讨论】:

    • 这也是一个很好的答案,可能会比我的解决方案快得多。
    • 同意Imjohns3,基本上是我以前不知道的这种“array=='T'”语法。
    【解决方案2】:

    一种方法是对输入文件的每个字符串进行更多处理以获得您期望的结果:

    with open('input.dat') as handle:
        data = asarray([[x == 'T' for x in line.strip().split()]
                        for line in handle],
                       dtype=bool)
    

    在这里,我正在阅读文件句柄中的每一行,然后对于该行中的每个字段,我将其与字符串'T' 进行比较。这将给出一个布尔结果,可以按预期将其存储在您的数据数组中。

    您提供的代码的问题在于 Python 正在尽最大努力将您提供的值转换为布尔值;但是,在 Python 中,当转换为布尔值时,非空字符串的计算结果为 True:bool('T') == bool('F') == bool('0') == bool('1') == True。

    【讨论】:

    • 这正是我所需要的,从你的回答中我还学到了隐式 for 循环,我没有使用太多但一直想要。
    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2016-09-04
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多