在一个numpy数组的文本文件中写入float和integer

时间:2014-08-04 15:05:46

标签: python text numpy ascii

我有一个nxm numpy数组,其数值为8位小数,如0.02113342NoValue数据-9999。我使用下面的行从numpy数组

创建一个文本文件
numpy.savetxt("result.asc", Numpy_Array, fmt="%.8f")#2D array to ASCII

但是,我会-9999.00000000而不是-9999。我打开文件并使用以下代码用-9999替换这些数字:

with file("result.asc", 'r') as original: 
    data = original.read()
    new = data.replace(str(-9999)+".00000000", str(-9999))
with file("result.asc", 'w') as modified:
    modified.write(new)

是否有更优雅的方式从头开始编写-9999而不是-9999.00000000,而不是再次打开整个文件并替换它们?

1 个答案:

答案 0 :(得分:4)

试试fmt="%.8g"。对于所有浮点值,它与"%.8f"不同(例如,对于非常小的值,它使用指数表示法),但它可能适用于您拥有的情况。 (请参阅https://docs.python.org/2/library/string.html#format-specification-mini-language表格中的浮点类型 - 向下滚动一下 - 以解释fg格式之间的差异。)

In [188]: x
Out[188]: 
array([[    0.20134635, -9999.        ],
       [    0.9287082 ,     0.00000123],
       [    0.77482316,     0.27246281],
       [    0.40529746,     0.41133371]])

In [189]: np.savetxt("xf.dat", x, fmt="%.8f")

In [190]: np.savetxt("xg.dat", x, fmt="%.8g")

In [191]: !cat xf.dat
0.20134635 -9999.00000000
0.92870820 0.00000123
0.77482316 0.27246281
0.40529746 0.41133371

In [192]: !cat xg.dat
0.20134635 -9999
0.9287082 1.2345679e-06
0.77482316 0.27246281
0.40529746 0.41133371

以下是x[1,1]的实际值:

In [193]: x[1,1]
Out[193]: 1.23456789e-06

或者,请看一下类似问题的答案:How to format in numpy savetxt such that zeros are saved only as "0"