在Python中将多个numpy文件追加到一个大的numpy文件中

3

我尝试将多个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

我真的不知道问题出在哪里。非常感谢任何帮助。

2个回答

2
你应该使用 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加载中有一些非常有趣的东西。它不会一次性加载所有附加的数组 :). 请阅读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

它给我这个答案:<未初始化文件的关闭文件>,模式'<未初始化文件的关闭文件>'位于0x7f3ed40e48a0处。 - nass9801
我没有看到任何问题。 - Shijo
我不理解这两个文件:with open(fpath, 'wb') as f_handle: for npfile in glob.glob("*.npy"): 你所说的fpath是指大文件的路径吗? - nass9801
我已将这个问题放在了这里:https://dev59.com/Ip_ha4cB1Zd3GeqPtRmW,我没想到你会回答我,非常感谢您,您真的很友善,再次感谢。 - nass9801
亲爱的@Shijo,我已经在这个问题https://dev59.com/Ip_ha4cB1Zd3GeqPtRmW中放置了我的代码,我没想到你会回答我,非常感谢你,你真的很好,谢谢。 - nass9801
显示剩余3条评论

0

np.save函数会写入一个元数据块(包含形状和数据类型信息)和一个数据块。而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来保存多个数组。

在Stack Overflow上,也有关于重复使用np.save到同一个文件的讨论。这并不难做到,但是load的操作就比较棘手了。https://dev59.com/OZTfa4cB1Zd3GeqPTqjd#35752728

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接