Python 3.x 如何使代码按正确的顺序调用每个文件?
我有一个包含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必须有一个38s 这就是我的意思: 我写了一些代码。但是我发现文件没有按顺序调用,因此标签是错误的。例如,AWA_s1_features.mat不是第一个要调用的文件,它已标记为11。AWA_s2_features.mat已标记为21 那么,如何改进代码,使其以正确的顺序调用每个文件呢 代码如下:Python 3.x 如何使代码按正确的顺序调用每个文件?,python-3.x,numpy,scipy,concatenation,glob,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
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})
问题是默认排序是按字母顺序的,这意味着“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})
这可能会有所帮助,它将允许您在打开文件之前对文件进行排序。请特别注意“数值排序”选项。您是否打印了列表
read_files
以查看grob
产生的顺序?我还建议制作x
和y
普通列表,将每个文件附加到列表中,然后在最后连接一次。这可能会有所帮助,它将允许您在打开文件之前对文件进行排序。请特别注意“数值排序”选项。您是否打印了列表read_files
以查看grob
产生的顺序?我还建议制作x
和y
普通列表,将每个文件附加到它们,然后在末尾连接一次。谢谢。“lambda”是什么意思?简单回答:lambda基本上是一个匿名函数。有关更多信息,请查看,谢谢。“lambda”是什么意思?简单回答:lambda基本上是一个匿名函数。有关更多信息,请查看