我试图把很多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
我真的不知道这个问题。任何帮助将不胜感激。
答案 0 :(得分:2)
您应该使用numpy.save或numpy.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