我正在尝试使用numpy.savetxt将4D numpy float数组输出到纯文本文件
然而numpy给出了一个错误,说当我尝试传递这个数组时需要一个float参数。然而,numpy doc指定要传递的参数应该只是数组...而不是它应该是最大等级2.我能使其工作的唯一方法是将数据重新整形为2D(这实际上不是因数据组织原因总是实用的)
有这个方法吗?或者必须将numpy数组重塑为2D? 我希望能够像逐列一样阅读fortran中的数据(通过维度进行处理)。
还有其他可能吗?请注意,我不想使用npy格式,因为我寻求与另一个需要纯文本格式的程序的兼容性。
答案 0 :(得分:5)
如果您查看numpy.savetxt
的源代码,您会找到
for row in X:
fh.write(asbytes(format % tuple(row) + newline))
因此numpy.savetxt
仅适用于1或2D阵列。
对于互操作性,如果有足够的内存将numpy数组转换为列表,则可以使用JSON:
import json
import numpy as np
a = np.arange(24).reshape(-1, 2, 3, 4).astype('float')
a[0,0,0,0] = np.nan
with open('/tmp/out', 'w') as f:
json.dump(a.tolist(), f, allow_nan = True)
产量
[[[[NaN, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, 11.0]], [[12.0, 13.0, 14.0, 15.0], [16.0, 17.0, 18.0, 19.0], [20.0, 21.0, 22.0, 23.0]]]]
答案 1 :(得分:3)
另一种方法是将数组保存为简单的数字列表(数组的平面版本),并沿其保存有关其形状的信息。
关于多维数组的问题在于,即使是以文本格式将它们从一个程序移动到另一个程序也不是那么简单。
你可以这样做:
myarray = rand(5,5,5)
name = 'myarray'+myarray.shape+'.txt'
np.savetxt(name,myarray.flatten())
并使用文件名中包含的大小信息来恢复初始形状