python - 从主文件夹的子文件夹中随机提取文件

标签 python dictionary

来自包含七个子文件夹的主文件夹中的 mat` 文件。每个文件夹都以类(class)编号命名。

import glob
import os
import hdf5storage
import numpy as np
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"     
files = glob.glob(DATASET_PATH + "**/*.mat", recursive= True)
class_labels = [i.split(os.sep)[-2] for i in files]

for label in range(0, len(class_labels)):
    class_labels [label] = int(class_labels[label])

files 变量包含以下内容:

enter image description here

类标签包含以下内容: enter image description here

我想问几个问题: 1) 当我读取 .mat 文件时,如果 dict 和每个 dict 包含不同的变量名就会出现。我想知道如何读取 key 并分配给数组?

array_store=[]
for f in files:
    mat = hdf5storage.loadmat(f)
    arrays = np.array(mat.keys())
    array_store.append(arrays)

enter image description here

2) files = glob.glob(DATASET_PATH + "**/*.mat", recursive= True) 是否可以从主目录中的每个文件夹中随机读取特定数量的文件文件夹?比如 60% 用于训练,40% 用于测试? 更新 我已经尝试了@vopsea 在答案中提出的建议。 输出看起来像 train 变量的输出。 enter image description here

我如何制作每个文件的最终图像数组 foy Key 1 - 7(数组(256 x 256 x 11 x 图像总数))和标签(图像总数 x 1)?标签将与键值相同,例如,与键 1 关联的所有文件(188 个文件)将具有标签 1 (188 x 1)。

更新
解决无键名制作标签和访问键的问题。

import os
import random
import hdf5storage
import numpy as np

DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"

train_images = []
test_images = []
train_label = list()
test_label = list()
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
    files = os.listdir(os.path.join(DATASET_PATH,x))
    random.shuffle(files)
    n = int(len(files) * percent_train)
    train_i = []
    test_i = []
    for i,f in enumerate(files):
        abs_path= os.path.join(DATASET_PATH,x,f)
        mat = hdf5storage.loadmat(abs_path)
        if(i < n):
            train_i.append(mat.values())
            train_label.append(x)
        else:
            test_i.append(mat.values())
            test_label.append(x)

    train_images.append(train_i)
    test_images.append(test_i)

最佳答案

1) 您能否在问题 1 中多解释一下您想要什么?附加了什么?我可能误会了,但很容易阅读未知的键值对

for key, value in mat.items():
    print(key, value)

2) 我这样做时没有 glob。打乱类文件并根据训练百分比将它们分成两个列表。可能最好为每个类(class)(或关闭类(class))提供相同数量的文件,因此培训不会特别偏爱一个类(class)。

import os
import random

DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"

train = {}
test = {}
percent_train = 0.4

class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
    files = os.listdir(os.path.join(DATASET_PATH,x))
    random.shuffle(files)
    n = int(len(files) * percent_train)
    train[x] = files[:n]
    test[x] = files[n:]

编辑 2: 这是你的意思吗?

import os
import random
import hdf5storage
import numpy as np

DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"

train_images = []
test_images = []
train_label = []
test_label = []
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
    files = os.listdir(os.path.join(DATASET_PATH,x))
    random.shuffle(files)
    n = int(len(files) * percent_train)
    for i,f in enumerate(files):
        abs_path= os.path.join(DATASET_PATH,x,f)
        mat = hdf5storage.loadmat(abs_path)
        if(i < n):
            train_images.append(mat.values())
            train_label.append(x)
        else:
            test_images.append(mat.values())
            test_label.append(x)

编辑 3:为简单起见使用 dict

请注意最后遍历图像是多么简单。另一种方法是存储两个列表(数据和标签),其中一个列表会有很多重复项。然后你必须同时通过它们。

虽然这取决于您稍后要做什么,但两个列表可能是正确的选择。

import os
import random
import hdf5storage
import numpy as np

DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"

train_images = {}
test_images = {}
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
    files = os.listdir(os.path.join(DATASET_PATH,x))
    random.shuffle(files)
    n = int(len(files) * percent_train)
    for i,f in enumerate(files):
        abs_path= os.path.join(DATASET_PATH,x,f)
        mat = hdf5storage.loadmat(abs_path)
        if(i < n):
            train_images[x] = mat.values()
        else:
            test_images[x] = mat.values()

for img_class,img_data in train_images.items():
    print( img_class, img_data )

关于python - 从主文件夹的子文件夹中随机提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57967261/

相关文章:

python - 跨pandas 数据框所有列的数学运算,无论其大小如何

Python CJKLIB : no pinyin tones

java - 再次解析List<Map<String,String>> String形式为POJO

python - 如何按照键的排序顺序从字典中获取值?

C++如何修改类中另一个类的映射

Python字典在字典中切换键

c# - 可以更新或删除的共享内存的线程安全枚举

python | Pandas |对象 |转换为整数或 float

Python脚本需要多次CTRL + C才能停止

python - 如何在 python OpenCV 3 中对图像的特定区域进行图像处理?