我有一个nxm
numpy数组,其数值为8位小数,如0.02113342
或NoValue
数据-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
,而不是再次打开整个文件并替换它们?
答案 0 :(得分:4)
试试fmt="%.8g"
。对于所有浮点值,它与"%.8f"
不同(例如,对于非常小的值,它使用指数表示法),但它可能适用于您拥有的情况。
(请参阅https://docs.python.org/2/library/string.html#format-specification-mini-language表格中的浮点类型 - 向下滚动一下 - 以解释f
和g
格式之间的差异。)
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"