я не мог понять, что делают эти строки кода? - PullRequest
0 голосов
/ 21 ноября 2018

В этой части класса я не понял, что делает этот код:

for file in os.listdir(path):
    if(os.path.isfile(os.path.join(path,file)) and select in file): 
        temp = scipy.io.loadmat(os.path.join(path,file))
        temp = {k:v for k, v in temp.items() if k[0] != '_'}
        for i  in range(len(temp[patch_type+"_patches"])):
            self.tensors.append(temp[patch_type+"_patches"][i])
            self.labels.append(temp[patch_type+"_labels"][0][i])

self.tensors = np.array(self.tensors)
self.labels = np.array(self.labels)

особенно эта строка:

temp = {k:v for k, v in temp.items() if k[0] != '_'}

весь класс выглядит следующим образом:

class Datasets(Dataset):
    def __init__(self,path,train,transform=None):
        if(train):
            select ="Training"
            patch_type = "train"
        else:
            select = "Testing"
            patch_type = "testing"

        self.tensors = []
        self.labels = []
        self.transform = transform


        for file in os.listdir(path):
            if(os.path.isfile(os.path.join(path,file)) and select in file): 

                temp = scipy.io.loadmat(os.path.join(path,file))
                temp = {k:v for k, v in temp.items() if k[0] != '_'}
                for i  in range(len(temp[patch_type+"_patches"])):
                    self.tensors.append(temp[patch_type+"_patches"][i])
                    self.labels.append(temp[patch_type+"_labels"][0][i])

        self.tensors = np.array(self.tensors)
        self.labels = np.array(self.labels)

    def __len__(self):
        try:
            if len(self.tensors) != len(self.labels):
                raise Exception("Lengths of the tensor and labels list are not the same")
        except Exception as e:
            print(e.args[0])
        return len(self.tensors)

    def __getitem__(self,idx):
        sample = (self.tensors[idx],self.labels[idx])
       # print(self.labels)
        sample = (torch.from_numpy(self.tensors[idx]),torch.from_numpy(np.array(self.labels[idx])).long())
        return sample
    #tuple containing the image patch and its corresponding label

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Это понимание слова ;в этом конкретном случае он создает новый dict из существующего dict temp, но только для элементов, для которых ключ k не начинается с подчеркивания.Эта проверка выполняется партией if ....

Она эквивалентна

new = {}
for k, v in temp.items():
    if key[0] != '_':
        new[k] = value
temp = new

или немного отличается:

new = {}
for key, value in temp.items():
    if not key.startswith('_'):
        new[key] = value
temp = new

Вы можете видеть, что она выглядитнемного приятнее, чем одна строка, так как он избегает временного диктата (new; под капотом он все же создает безымянный временный диктат).

0 голосов
/ 21 ноября 2018

Отфильтровывает переменные с префиксом подчеркивания из загруженного файла MATLAB.Из scipy документации функция scipy.io.loadmat возвращает словарь, содержащий имена переменных из загруженного файла в качестве ключей и матрицы в качестве значений.Строка кода, на которую вы ссылаетесь, представляет собой словарное понимание , которое клонирует словарь минус переменные, которые не проходят условную проверку.

Update

Что происходит здесь примерно так:

  1. Загрузить файл MATLAB (file в вашем коде) в виде хэш-карты (словаря), где ключи - это имена переменных из файла, а значения - это матрицы, присваиваемые temp.
  2. Выполните итерацию по этим парам ключ / значение, отбросьте префикс с подчеркиванием и переназначьте результаты этой итерации на temp.
  3. Прибыль
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...