将多个numpy文件附加到python中的一个大numpy文件中

时间:2017-02-10 13:30:08

标签: python numpy

我试图把很多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

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

2 个答案:

答案 0 :(得分:2)

您应该使用numpy.savenumpy.savez来创建pickle .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

答案 1 :(得分: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来保存多个数组。

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