如何将多维数组写入文本文件? [英] How to write a multidimensional array to a text file?

查看:58
本文介绍了如何将多维数组写入文本文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在另一个问题中,如果我能提供我遇到问题的阵列,其他用户会提供一些帮助.但是,我什至无法完成基本的 I/O 任务,例如将数组写入文件.

In another question, other users offered some help if I could supply the array I was having trouble with. However, I even fail at a basic I/O task, such as writing an array to a file.

谁能解释一下我需要将一个 4x11x14 的 numpy 数组写入文件需要什么样的循环?

这个数组由四个 11 x 14 数组组成,所以我应该用一个漂亮的换行符来格式化它,以便其他人更容易阅读文件.

This array consist of four 11 x 14 arrays, so I should format it with a nice newline, to make the reading of the file easier on others.

编辑:所以我尝试了 numpy.savetxt 功能.奇怪的是,它给出了以下错误:

Edit: So I've tried the numpy.savetxt function. Strangely, it gives the following error:

TypeError: float argument required, not numpy.ndarray

我认为这是因为该函数不适用于多维数组?我希望在一个文件中提供任何解决方案?

I assume that this is because the function doesn't work with multidimensional arrays? Any solutions as I would like them within one file?

推荐答案

如果你想把它写到磁盘上以便它可以很容易地作为一个 numpy 数组读回,请查看 numpy.save.酸洗它也可以正常工作,但对于大型数组效率较低(你的不是,所以两者都很好).

If you want to write it to disk so that it will be easy to read back in as a numpy array, look into numpy.save. Pickling it will work fine, as well, but it's less efficient for large arrays (which yours isn't, so either is perfectly fine).

如果您希望它是人类可读的,请查看 <代码>numpy.savetxt.

If you want it to be human readable, look into numpy.savetxt.

所以,对于大于 2 维的数组来说,savetxt 似乎不是一个很好的选择......但只是为了将所有内容绘制出来这是完整的结论:

So, it seems like savetxt isn't quite as great an option for arrays with >2 dimensions... But just to draw everything out to it's full conclusion:

我刚刚意识到 numpy.savetxt 在超过 2 个维度的 ndarrays 上阻塞...这可能是设计使然,因为没有固有定义的方式来指示文本文件中的其他维度.

I just realized that numpy.savetxt chokes on ndarrays with more than 2 dimensions... This is probably by design, as there's no inherently defined way to indicate additional dimensions in a text file.

例如这(一个二维数组)工作正常

E.g. This (a 2D array) works fine

import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)

虽然对于 3D 数组,同样的事情会失败(有一个相当无信息的错误:TypeError:需要浮点参数,而不是 numpy.ndarray):

While the same thing would fail (with a rather uninformative error: TypeError: float argument required, not numpy.ndarray) for a 3D array:

import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)

一种解决方法是将 3D(或更大)阵列分解为 2D 切片.例如

One workaround is just to break the 3D (or greater) array into 2D slices. E.g.

x = np.arange(200).reshape((4,5,10))
with open('test.txt', 'w') as outfile:
    for slice_2d in x:
        np.savetxt(outfile, slice_2d)

然而,我们的目标是清晰易读,同时仍然可以通过 numpy.loadtxt 轻松读回.因此,我们可以更详细一些,并使用注释掉的行来区分切片.默认情况下,numpy.loadtxt 将忽略任何以 # 开头的行(或由 comments kwarg 指定的任何字符).(这看起来比实际更冗长...)

However, our goal is to be clearly human readable, while still being easily read back in with numpy.loadtxt. Therefore, we can be a bit more verbose, and differentiate the slices using commented out lines. By default, numpy.loadtxt will ignore any lines that start with # (or whichever character is specified by the comments kwarg). (This looks more verbose than it actually is...)

import numpy as np

# Generate some test data
data = np.arange(200).reshape((4,5,10))

# Write the array to disk
with open('test.txt', 'w') as outfile:
    # I'm writing a header here just for the sake of readability
    # Any line starting with "#" will be ignored by numpy.loadtxt
    outfile.write('# Array shape: {0}
'.format(data.shape))
    
    # Iterating through a ndimensional array produces slices along
    # the last axis. This is equivalent to data[i,:,:] in this case
    for data_slice in data:

        # The formatting string indicates that I'm writing out
        # the values in left-justified columns 7 characters in width
        # with 2 decimal places.  
        np.savetxt(outfile, data_slice, fmt='%-7.2f')

        # Writing out a break to indicate different slices...
        outfile.write('# New slice
')

这产生:

# Array shape: (4, 5, 10)
0.00    1.00    2.00    3.00    4.00    5.00    6.00    7.00    8.00    9.00   
10.00   11.00   12.00   13.00   14.00   15.00   16.00   17.00   18.00   19.00  
20.00   21.00   22.00   23.00   24.00   25.00   26.00   27.00   28.00   29.00  
30.00   31.00   32.00   33.00   34.00   35.00   36.00   37.00   38.00   39.00  
40.00   41.00   42.00   43.00   44.00   45.00   46.00   47.00   48.00   49.00  
# New slice
50.00   51.00   52.00   53.00   54.00   55.00   56.00   57.00   58.00   59.00  
60.00   61.00   62.00   63.00   64.00   65.00   66.00   67.00   68.00   69.00  
70.00   71.00   72.00   73.00   74.00   75.00   76.00   77.00   78.00   79.00  
80.00   81.00   82.00   83.00   84.00   85.00   86.00   87.00   88.00   89.00  
90.00   91.00   92.00   93.00   94.00   95.00   96.00   97.00   98.00   99.00  
# New slice
100.00  101.00  102.00  103.00  104.00  105.00  106.00  107.00  108.00  109.00 
110.00  111.00  112.00  113.00  114.00  115.00  116.00  117.00  118.00  119.00 
120.00  121.00  122.00  123.00  124.00  125.00  126.00  127.00  128.00  129.00 
130.00  131.00  132.00  133.00  134.00  135.00  136.00  137.00  138.00  139.00 
140.00  141.00  142.00  143.00  144.00  145.00  146.00  147.00  148.00  149.00 
# New slice
150.00  151.00  152.00  153.00  154.00  155.00  156.00  157.00  158.00  159.00 
160.00  161.00  162.00  163.00  164.00  165.00  166.00  167.00  168.00  169.00 
170.00  171.00  172.00  173.00  174.00  175.00  176.00  177.00  178.00  179.00 
180.00  181.00  182.00  183.00  184.00  185.00  186.00  187.00  188.00  189.00 
190.00  191.00  192.00  193.00  194.00  195.00  196.00  197.00  198.00  199.00 
# New slice

读回它很容易,只要我们知道原始数组的形状.我们可以只做 numpy.loadtxt('test.txt').reshape((4,5,10)).举个例子(你可以在一行中做到这一点,我只是为了澄清事情而冗长):

Reading it back in is very easy, as long as we know the shape of the original array. We can just do numpy.loadtxt('test.txt').reshape((4,5,10)). As an example (You can do this in one line, I'm just being verbose to clarify things):

# Read the array from disk
new_data = np.loadtxt('test.txt')

# Note that this returned a 2D array!
print new_data.shape

# However, going back to 3D is easy if we know the 
# original shape of the array
new_data = new_data.reshape((4,5,10))
    
# Just to check that they're the same...
assert np.all(new_data == data)

这篇关于如何将多维数组写入文本文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆