【问题标题】:How to concat many numpy arrays?如何连接许多numpy数组?
【发布时间】:2017-04-13 13:37:39
【问题描述】:

我正在尝试连接许多numpy数组,我将每个数组放在一个文件中,实际上我有很多文件的问题,内存无法支持创建一个大数组Data_Array = np.zeros((1000000,7000)),我将放在哪里我所有的文件。所以,我在这个问题Combining NumPy arrays 中发现我可以使用np.concatenate

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替换为我的文件文件夹的路径:

import matplotlib.pyplot as plt 
import numpy as np
import glob
import os, sys
fpath ="Path_To_Big_File"
npyfilespath =r'Path_To_Many_Numpy_Files'  
os.chdir(npyfilespath)
npfiles= glob.glob("*.npy")
npfiles.sort()
for i,npfile in enumerate(npfiles):
    dataArray=np.concatenate(npfile, axis=0)
np.save(fpath, all_arrays)

它给了我这个错误:

np.concatenate(npfile, axis=0)

ValueError: zero-dimensional arrays cannot be concatenated 

你能帮我使这个方法np.concatenate 有效吗?

【问题讨论】:

  • 您是否尝试过保存和读取 HDF5 文件中的数据?它支持分片流式传输数据
  • @NilsWerne,非常感谢您的回答,但我不尝试 HDF5 文件,因为我的目标是拥有一个包含我所有文件的大 numpy 文件,这个文件将帮助我进行可能的分析。
  • 如果您添加某种“真实测试”,例如if npfile: np.concatenate(npfile, axis=0)... 也就是说,if npfile is not None... 你也可以使用 try-except 块来跳过 ValueErrors。
  • 等一下...您正在尝试连接i,这是npfiles 列表的索引;不是实际的文件本身。
  • @not_a_robot 对不起,这是一个错误,我纠正它

标签: python arrays numpy


【解决方案1】:

如果您希望使用大型数组,只需使用 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()

flush 方法确保所有内容都已写入磁盘

【讨论】:

  • 通过使用这种方法,我创建了一个形状为 (1000000,8000) 的数组,但是如何将保存在我的文件夹中的 numpy 文件放入该文件中?
  • 它们的形状和类型是否相同?
  • 其实每个文件的形状都是(1,8000),它们是一个numpy文件,我想把它们都放在同一个文件里,所以为了有一个正确的工作,结果文件必须具有形状 (1000000,8000) ,我在输入中有百万个 numpy 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2011-05-08
  • 2020-07-24
  • 2017-05-27
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多