2017-04-13 66 views
1

我想连接很多numpy数组,我把每个数组放在一个文件中,其实问题是我有很多文件,内存不支持创建一个大数组Data_Array = np.zeros((1000000,7000)),在那里我会把所有的文件。如何连接许多numpy数组?

file1= np.load('file1_Path.npy') 
file2= np.load('file2_Path.npy') 
file3= np.load('file3_Path.npy') 
file4= np.load('file4_Path.npy') 
dataArray=np.concatenate((file1, file2, file3, file4), axis=0) 
test= dataArray.shape 
print(test) 
print (dataArray) 
print (dataArray.shape) 
plt.plot(dataArray.T) 
plt.show() 

这种方式给了我一个非常好的结果,但现在,我需要的路径替换file1, file2, file3, file4到我的文件夹:

所以,我在这个问题 Combining NumPy arrays,我可以使用 np.concatenate发现 ​​

它给我这个错误:

np.concatenate(npfile, axis=0) 

ValueError: zero-dimensional arrays cannot be concatenated 

能否请你帮我做这个方法np.concatenate作品?

+0

您是否尝试保存并读取HDF5文件中的数据?它支持流式传输数据 –

+0

@NilsWerne,非常感谢您的回答,但我不尝试HDF5文件,因为我的目标是有一个大的numpy文件,它包含我所有的文件,这个文件将帮助我做可能分析。 – Guillaume

+0

如果您添加某种“真理测试”,例如'如果npfile:np.concatenate(npfile,axis = 0)'...也就是说,如果npfile不是None ...你也可以使用try-except块来传递ValueError。 – blacksite

回答

0

如果您希望使用大型数组,只需使用np.memmap,而不是将数据加载到内存中。 memmap的优点是,必要时数据总是保存到磁盘。例如,您可以按以下方式创建内存映射阵列:

import numpy as np 

a=np.memmap('myFile',dtype=np.int,mode='w+',shape=(1000000,8000)) 

然后,您可以使用'a'作为正常的numpy数组。 这个限制就是你的硬盘!这将在您的硬盘上创建一个文件,以供您稍后阅读。您只需将模式更改为'r'并从数组中读取数据。 约MEMMAP这里更多信息:https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

为了填补形状(1,8000)的NPY文件阵列,只写:

for i,npFile in enumerate(npfFiles): 
    a[i,:]=np.load(npFile) 
a.flush() 

冲洗方法确保一切都已经写在磁盘

+0

通过使用此方法,我创建了一个带有形状(1000000,8000)的数组,但是如何将我的numpy文件保存在该文件的文件夹中? – Guillaume

+0

他们有相同的形状和类型吗? – ma3oun

+0

其实每个文件的形状都是(1,8000),它们是一个numpy文件,我想把它们全部放在同一个文件中,所以为了有一个正确的工作,结果文件必须有形状(1000000 ,8000),我有百万numpy文件输入。 – Guillaume