如何在python中将多个numpy文件附加到一个numpy文件中

2024-09-29 02:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着放很多numpy文件来得到一个大的numpy文件,我试着遵循这两个链接Append multiple numpy files to one big numpy file in pythonPython append multiple files in given order to one big file这就是我所做的:

import matplotlib.pyplot as plt 
import numpy as np
import glob
import os, sys
fpath ="/home/user/Desktop/OutFileTraces.npy"
npyfilespath ="/home/user/Desktop/test"   
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(npyfilespath, npfile)
        print filepath
        # Load file
        dataArray= np.load(filepath)
        print dataArray
        np.save(f_handle,dataArray)
        dataArray= np.load(fpath)
        print dataArray

我有一个结果的例子:

/home/user/Desktop/Trace=96
[[ 0.01518007  0.01499514  0.01479736 ..., -0.00392216 -0.0039761
  -0.00402747]]
[[-0.00824758 -0.0081808  -0.00811402 ..., -0.0077236  -0.00765425
  -0.00762086]]
/home/user/Desktop/Trace=97
[[ 0.00614908  0.00581004  0.00549154 ..., -0.00814741 -0.00813457
  -0.00809347]]
[[-0.00824758 -0.0081808  -0.00811402 ..., -0.0077236  -0.00765425
  -0.00762086]]
/home/user/Desktop/Trace=98
[[-0.00291786 -0.00309509 -0.00329287 ..., -0.00809861 -0.00797789
  -0.00784175]]
[[-0.00824758 -0.0081808  -0.00811402 ..., -0.0077236  -0.00765425
  -0.00762086]]
/home/user/Desktop/Trace=99
[[-0.00379887 -0.00410453 -0.00438963 ..., -0.03497837 -0.0353842
  -0.03575151]]
[[-0.00824758 -0.0081808  -0.00811402 ..., -0.0077236  -0.00765425
  -0.00762086]

这一行表示第一个跟踪:

[[-0.00824758 -0.0081808  -0.00811402 ..., -0.0077236  -0.00765425
      -0.00762086]]

它一直在重复。

两天前,我问了第二个问题,起初我认为我有最好的答案,但在尝试对最终文件“OutFileTraces.npy”进行打印和批处理建模之后,我发现我的代码:

1/不按顺序打印“test”文件夹中的numpy文件(trace0、trace1、trace2,…)

2/只保存文件中的最后一个跟踪,我的意思是当打印或打印OutFileTraces.npy时,我只找到一个跟踪,它是第一个跟踪。

所以我需要更正我的代码,因为我真的被屏蔽了。如果你能帮助我,我将非常感激。

提前谢谢。


Tags: 文件inimportnumpyhomeosasnp
2条回答

如中所述

loading arrays saved using numpy.save in append mode

可以多次保存到打开的文件中,也可以多次加载。这并没有记录在案,也许也不是首选,但它确实有效。savez存档是保存多个数组的首选方法。

下面是一个玩具示例:

In [777]: with open('multisave.npy','wb') as f:
     ...:     arr = np.arange(10)
     ...:     np.save(f, arr)
     ...:     arr = np.arange(20)
     ...:     np.save(f, arr)
     ...:     arr = np.ones((3,4))
     ...:     np.save(f, arr)
     ...:     
In [778]: ll multisave.npy
-rw-rw-r-- 1 paul 456 Feb 13 08:38 multisave.npy
In [779]: with open('multisave.npy','rb') as f:
     ...:     arr = np.load(f)
     ...:     print(arr)
     ...:     print(np.load(f))
     ...:     print(np.load(f))
     ...:     
[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]

下面是一个保存相同形状数组列表的简单示例

In [780]: traces = [np.arange(10),np.arange(10,20),np.arange(100,110)]
In [781]: traces
Out[781]: 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
 array([100, 101, 102, 103, 104, 105, 106, 107, 108, 109])]
In [782]: arr = np.array(traces)
In [783]: arr
Out[783]: 
array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9],
       [ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19],
       [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]])

In [785]: np.save('mult1.npy', arr)

In [786]: data = np.load('mult1.npy')
In [787]: data
Out[787]: 
array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9],
       [ 10,  11,  12,  13,  14,  15,  16,  17,  18,  19],
       [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]])
In [788]: list(data)
Out[788]: 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
 array([100, 101, 102, 103, 104, 105, 106, 107, 108, 109])]
  1. Glob生成无序列表。您需要使用额外的行显式排序,因为排序过程已就位,并且不返回列表。

    npfiles = glob.glob("*.npy")
    npfiles.sort()
    for npfile in npfiles:
        ...
    
  2. NumPy文件包含一个数组。如果您想在一个文件中存储多个数组,您可以查看.npz文件和np.savezhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.savez.html#numpy.savez我还没有看到这个在广泛使用,所以您可能希望认真考虑替代方案。

    1. 如果数组都是相同的形状并存储相关数据,则可以生成更大的数组。假设当前形状是(N_1, N_2),并且您有N_0这样的数组。循环

      all_arrays = []
      for npfile in npfiles:
          all_arrays.append(np.load(os.path.join(npyfilespath, npfile)))
      all_arrays = np.array(all_arrays)
      np.save(f_handle, all_array)
      

      将生成具有单个形状数组的文件(N_0, N_1, N_2)

    2. 如果需要按名称访问阵列,HDF5文件是一个很好的匹配项。请参阅http://www.h5py.org/(一个完整的简介对于SO回复来说太多了,请参阅快速入门指南http://docs.h5py.org/en/latest/quick.html

相关问题 更多 >