当前位置: 首页 > 面试题库 >

如何将多维数组写入文本文件?

施英哲
2023-03-14
问题内容

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

谁能解释我需要向文件写入4x11x14 numpy数组的哪种循环?

该数组由四个11 x 14数组组成,因此我应该使用漂亮的换行符对其进行格式化,以使文件读取更加容易。

编辑 :所以我已经尝试了numpy.savetxt函数。奇怪的是,它给出了以下错误:

TypeError: float argument required, not numpy.ndarray

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


问题答案:

如果您想将其写到磁盘上以便以numpy数组的形式轻松读回,请查看numpy.save。对其进行酸洗也可以,但是对于大型阵列而言效率较低(您的不是,因此两者都很好)。

如果您希望它易于阅读,请参阅numpy.savetxt

编辑: 所以,savetxt对于> 2维的数组,似乎不是一个很好的选择…但是只是为了得出所有结论,它的全部结论是:

我刚刚意识到,numpy.savetxt大于2维的ndarray上的阻塞…这可能是设计使然,因为没有固有定义的方式来指示文本文件中的其他维。

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

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

TypeError: float argument required, not numpy.ndarray对于3D数组,相同的操作将失败(错误消息不多:):

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

一种解决方法是将3D(或更大尺寸)阵列分成2D切片。例如

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将忽略任何以#(或commentskwarg指定的任何字符)开头的行。(看起来比实际要冗长得多…)

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}\n'.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\n')

这样产生:

# 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))。作为一个示例(您可以在一行中完成此操作,我只是在冗长地澄清事情):

# 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)


 类似资料:
  • 问题内容: 我一直在尝试将数组写入文件。我知道如何将整数或字符串写入文件,但是要带一个数组会使我感到困惑。我现在正在使用这个: 问题答案: 就像其他人说的那样,您可以循环遍历数组并逐个打印出元素。为了使输出显示为数字而不是您看到的“字母和符号”,您需要将每个元素转换为字符串。因此,您的代码将如下所示: 如果您只想打印类似的数组,则可以使用此衬纸替换循环:

  • 问题内容: 我有一个示例数组如下 我想将此数组写入文件,例如我得到的文件如下 问题答案: 如果它是一个巨大的数组,并且在写入之前需要太多内存才能将其序列化为字符串,则可以使用流:

  • 问题内容: 我想打开一个新的文本文件,然后将numpy数组保存到该文件。我写了这段代码: 我收到此错误: 有人知道怎么了吗? 另外,我在终端中找到了一个名为file_2的空文件,但是里面没有任何内容。 编辑:我正在使用Python3.4 问题答案: 看来您正在使用Python3。因此,请以二进制模式()而非文本模式()打开文件: 另外,关闭文件句柄,以确保将所有内容都写入磁盘。您可以使用-stat

  • 问题内容: 我认为能够将文本文件读入和写出字符串数组的能力是相当普遍的要求。从一种语言开始消除最初访问数据库的需求时,它也非常有用。Golang中是否存在? 例如 和 我宁愿使用现有的而不是重复的。 问题答案: 从Go1.1版本开始,有一个bufio.Scanner API可以轻松读取文件中的行。考虑上面的以下示例,该示例使用Scanner重写:

  • 我有一个二维数组,想通过java代码写入一个excel文件单元格区域中,并支持导出xlsx文件。 应该如何实现?

  • 问题内容: 我正在从Google文档中提取数据,进行处理,然后将其写入文件(最终我将其粘贴到Wordpress页面中)。 它具有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号? 目前,我正在将所有内容都转换为,将它们全部合并为Python字符串,然后执行以下操作: 最后一行存在编码错误: 编解码器无法解码位置12286的字节:序数不在范围内(128) 部分解决方案: