9

我正在尝试使用 numpy.savetxt 将 4D numpy 浮点数组输出到纯文本文件

然而 numpy 给出了一个错误,说当我尝试传递这个数组时需要一个浮点参数。尽管如此,numpy doc指定要传递的参数应该只是数组......而不是它应该是最大等级2。我可以使它工作的唯一方法是将数据重塑为2D(这实际上不是出于数据组织的原因总是实用的)

有没有办法解决这个问题?还是必须将 numpy 数组重塑为二维?我期望能够像逐列样式一样读取fortran中的数据(通过维度进行处理)。

还有其他可能性吗?请注意,我不想使用 npy 格式,因为我寻求与另一个需要纯文本格式的程序的兼容性。

4

2 回答 2

5

如果您查看源代码,numpy.savetxt您会发现

    for row in X:
        fh.write(asbytes(format % tuple(row) + newline))

所以numpy.savetxt只适用于一维或二维阵列。

对于互操作性,如果您有足够的内存将 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]]]]
于 2012-11-21T15:23:21.927 回答
3

另一种方法是将数组保存为简单的数字列表(数组的平面版本),并保存有关其形状的信息。

多维数组的问题在于,即使以文本格式将它们从一个程序移动到另一个程序也不是那么简单。

你可以这样做:

myarray = rand(5,5,5)
name = 'myarray'+myarray.shape+'.txt'
np.savetxt(name,myarray.flatten())

并使用文件名中包含的大小信息来恢复初始形状

于 2012-11-21T15:38:23.333 回答