如何让我的代码以正确的顺序调用每个文件?
How can I make my code call each file in the correct sequence?
我有一个包含 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) 等等。
在进行机器学习时,我需要将所有这些文件加入一个巨大的数组中并标记每一行。所以对于 AWA_s1_features.mat 的 139 行,必须有 139 个 1;对于 AWA_s2_features.mat 必须有 199 个 2,依此类推直到 AWA_s38_features.mat 必须有一个 # of 38s.
这就是我的意思:
我写了一些代码。但是我发现文件没有按顺序调用,因此标签是错误的。例如,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})
问题是默认排序是按字母顺序排列的,这意味着“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})
我有一个包含 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) 等等。
在进行机器学习时,我需要将所有这些文件加入一个巨大的数组中并标记每一行。所以对于 AWA_s1_features.mat 的 139 行,必须有 139 个 1;对于 AWA_s2_features.mat 必须有 199 个 2,依此类推直到 AWA_s38_features.mat 必须有一个 # of 38s.
这就是我的意思:
我写了一些代码。但是我发现文件没有按顺序调用,因此标签是错误的。例如,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})
问题是默认排序是按字母顺序排列的,这意味着“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})