【问题标题】:Append multiple numpy files to one big numpy file in python将多个 numpy 文件附加到 python 中的一个大 numpy 文件
【发布时间】:2023-03-06 01:21:01
【问题描述】:

我正在尝试将许多 numpy 文件放入一个大的 numpy 文件中,我尝试点击此链接 Python append multiple files in given order to one big file,这就是我所做的:

import matplotlib.pyplot as plt 
import numpy as np
import os, sys

#Read in list of files. You might want to look into os.listdir()

path= "/home/user/Desktop/ALLMyTraces.npy/test"
#Test folder contains all my numpy file traces
traces= os.listdir(path)

# Create new File
f = open("/home/user/Desktop/ALLMyTraces.npy", "w")

for j,trace in enumerate(traces):

    # Find the path of the file
    filepath = os.path.join(path, trace)

    # Load file
    dataArray= np.load(filepath)
    f.write(dataArray)

文件已创建,为了验证内容是否正确,我使用了以下代码:

import numpy as np
dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy')
print(dataArray)

因此产生此错误:

 dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy')
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 401, in load
    "Failed to interpret file %s as a pickle" % repr(file))
IOError: Failed to interpret file '/home/user/Desktop/ALLMyTraces.npy' as a pickle

我真的不知道问题所在。任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您应该使用numpy.savenumpy.savez 创建腌制的.npy 或.npz 二进制文件。 numpy.load() 只能读取这些文件。由于您使用 f.write(dataArray) 创建文本文件,因此 np.load() 因上述错误而失败

    这是一个示例

    fpath ="path to big file"
    npyfilespath ='path to nympy files to be merged '   
    os.chdir(npyfilespath)
    
    with open(fpath, 'wb') as f_handle:
        for npfile in glob.glob("*.npy"):
    
            # Find the path of the file
            filepath = os.path.join(path, npfile)
            print filepath
            # Load file
            dataArray= np.load(filepath)
            print dataArray
            np.save(f_handle,dataArray)
    dataArray= np.load(fpath)
    print dataArray
    

    刚刚发现在 numpy load 中有一些非常有趣的东西。它不会一次加载所有附加数组:)。阅读此post 了解更多信息。

    这意味着,如果你想读取所有附加的数组,你需要多次加载它们。

    f = open(fpath, 'rb')
    dataArray= np.load(f) #loads first array
    print dataArray
    dataArray= np.load(f)  #loads Second array
    print dataArray
    dataArray= np.load(f) #loads Third array
    print dataArray
    

    【讨论】:

    • 它给了我这个答案:', mode '' at 0x7f3ed40e48a0>
    • 我没有发现任何问题
    • 非常感谢您的帮助,但在这种情况下,文件只保存最后一个文件的内容。
    • 这是什么意思?它应该保存该目录中所有 npy 文件中的数据
    • 我不明白那些拖曳文件:使用 open(fpath, 'wb') as f_handle: for npfile in glob.glob("*.npy"): 你指的是 fpath:大文件的路径??
    【解决方案2】:

    np.save 写入一个元块(带有 shape 和 dtype 类型的信息)和一个数据块。 np.load 是补码,能够读取该格式。

    dataArray= np.load(filepath)
    

    dataArray 现在是内存中的一个数组,就像原来的数组一样。它不是filepath 内容的直接图像。

    f.write(dataArray)
    

    我什至不确定这会写入文件;它肯定与save/load 不兼容。因此,您的通用 Python 文件链接将您送错了方向。

    在一个文件中保存多个数组有两种直接的方法:

    • 将数组连接成一个更大的数组,然后保存。这需要尺寸兼容性。

    • np.savez 将多个数组保存到 zip 存档。也就是说,每个数组都保存到一个npy 文件中,并且这些都被收集到存档中。 np.load 能够加载这样的 npz 存档(但请阅读它关于延迟加载的内容)。

    对此有一些变化。您可以使用外部工具滚动您自己的存档。您还可以创建复杂的对象类型数组,np.save/load 可以处理。如果无法以普通方式保存元素,它将恢复为pickle。实际上你可以使用pickle 来保存多个数组。

    也有关于重复使用np.save 到同一个文件的讨论。这并不难做到,但做load 比较棘手。 https://stackoverflow.com/a/35752728/901925

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多