如何让我的代码以正确的顺序调用每个文件?

时间:2016-09-22 18:50:42

标签: python-3.x numpy scipy concatenation glob

我有一个包含38个文件的文件夹。名字是这样的: AWA_s1_features.mat,AWA_s2_features.mat ...... AWA_s38_features.mat 每个文件都是一个包含28列但具有不同行数的数组。例如:AWA_s1_features.mat =(139,28),AWA_s2_features.mat =(199,28)等等。

当我正在进行机器学习时,我需要将所有这些文件加入到一个巨大的数组中并标记每一行。因此对于139行AWA_s1_features.mat,必须有139个1;对于AWA_s2_features.mat,必须有199个2,依此类推,直到AWA_s38_features.mat必须有38个#。

这就是我的意思: enter image description here

我写了一些代码。但我发现文件没有按顺序调用,因此标签错误。例如,AWA_s1_features.mat不是第一个要调用的文件,它已标记为11. AWA_s2_features.mat已标记为21.

那么如何改进我的代码以便它以正确的顺序调用每个文件?

以下是代码:

    import numpy as np
    import scipy.io as sio
    import glob

    read_files = glob.glob('I:/2D/Features 2D/AWA_s*.mat') 
    x = np.array([])
    y = np.array([])
    q = 1
    for f in read_files:     
        l=sio.loadmat(f)['features']
        x = np.concatenate((x, l), axis=0) if x.size else l 
        y_temp = q*np.ones((l.shape[0],1))
        y = np.concatenate((y, y_temp), axis=0) if y.size else y_temp
        q = q + 1
    sio.savemat('AWA_FeaturesAll.mat', {'x':x, 'y':y})

1 个答案:

答案 0 :(得分:2)

问题是默认排序是按字母顺序排列的,这意味着" 11"来之前" 2"。你想要数字排序,一种方法是使用带有关键参数的排序函数,如下所示:

import numpy as np
import scipy.io as sio
import glob

read_files = glob.glob('I:/2D/Features 2D/AWA_s*.mat') 
x = np.array([])
y = np.array([])
q = 1
for f in sorted(read_files, key=lambda f: int(f.split('_')[1][1:])):     
    l=sio.loadmat(f)['features']
    x = np.concatenate((x, l), axis=0) if x.size else l 
    y_temp = q*np.ones((l.shape[0],1))
    y = np.concatenate((y, y_temp), axis=0) if y.size else y_temp
    q = q + 1
sio.savemat('AWA_FeaturesAll.mat', {'x':x, 'y':y})