2014-02-04 3 views
0

У меня есть папка, содержащая подпапки (SEQ1, SEQ2, SEQ3 и т. Д.), Каждая из которых содержит 40 изображений.Заполнение dict из цикла for в Python

Я хочу выполнить цикл над каждым изображением, выполнить операцию, которая дает значение, затем получить среднее значение из 40 значений в каждой подпапке и поместить это значение в dict как «значение» с названием подпапка - это «ключ».

Вот что я пробовал:

dic = {} 

for (dirname, dirnames, filenames) in os.walk('C:\Users\....'): 

for keys in dirnames: 
rec_3 = [] 


    for subdirname in filenames: 

     ds = dicom.read_file(os.path.join(dirname, subdirname)) #reading in DICOM images 
     lx, ly = ds.pixel_array.shape # beginning of operation 
     X, Y = np.ogrid[0:lx, 0:ly] 
     mask = (X - lx/2)**2 + (Y - ly/2)**2 < lx*ly/8 
     st_dev = np.std(ds.pixel_array[mask]) # end of operation 
     rec_3.append(st_dev) 
    rec_3_avg = np.mean(rec_3) 
    dic.update({keys:rec_3_avg}) 

print dic 

я получаю следующий результат "{ 'SEQ3': нан 'SEQ2': нан 'SEQ1': нан 'Seq4': нан}"

Мой идеальный результат имеет среднее значение 40 значений в каждой подпапке как значение здесь вместо «nan».

Помогите оценить очень.

+0

Вы уверены, что '' ds.pixel_array [маска] '' не пустой массив, потому что '' np.std ([]) '' результаты в '' nan'' – Dietrich

+0

Добавить несколько тестов результаты операций. Вы также должны повторно инициализировать переменную rec_3 до пустого списка перед циклом имен файлов. В противном случае вы вычисляете среднее значение файлов текущего каталога и всех предыдущих. – Frodon

+0

@ Dietrich хорошая точка! он пуст, но странно, если я выполняю операцию OUTSIDE цикла «для ключей ...», это работает, т. е. ds.pixel_array [mask] не пуст. Возможно, это означает, что изображения на самом деле не читаются должным образом, что означало бы, что проблема должна лежать в цикле «для subdirname ...», фактически не повторяя изображения ... но это все еще оставляет мне вопрос о Зачем? – Foodaaaay

ответ

0

Я хотел бы сделать словарь этих значений в подкаталоге первого и вычислить средства впоследствии, только личные предпочтения и легче читать.

dic_std_dev = {} 
base_path = '.' 
for root, dirs, files in os.walk(base_path): 
    #print dirs 
    for f in files: 
     if root != base_path: #If this is a subdirectory 
      ds = dicom.read_file(os.path.join(root, f)) #reading in DICOM images 
      lx, ly = ds.pixel_array.shape # beginning of operation 
      X, Y = np.ogrid[0:lx, 0:ly] 
      mask = (X - lx/2)**2 + (Y - ly/2)**2 < lx*ly/8 
      array = ds.pixel_array[mask] 
      if array: 
       st_dev = np.std(array) # end of operation 
       if root in dic_std_dev.keys(): 
        dic_std_dev[root].append(st_dev) 
       else: 
        dic_std_dev[root] = [st_dev] 

dic = {} 
for key in dic_std_dev.keys(): 
    if len(dic_std_dev[key]) > 0: 
     dic[key] = np.mean(dic_std_dev[key]) 

print dic 
+0

«если корень в dic.keys():« здесь возникает ошибка, что вы имели в виду? – Foodaaaay

+0

жаль, что это должно было быть 'if root in dic_std_dev.keys()' – jbh

+0

ОК, это отлично работает.В конце концов, любая идея, как заставить «ключ» быть только SEQ1, SEQ2 и т. Д., Как в имени dirs вместо корня? – Foodaaaay

0

Вы можете попробовать эту версию:

dic = {} 

for root, dirs, files in os.walk('C:\Users\....'): 
    for dirname in dirs: 
     if dirname.startswith('.'): 
      dirs.remove(dirname) 
    rec_3 = []   
    for filename in files:  
     ds = dicom.read_file(os.path.join(root, filename)) #reading in DICOM images 
     lx, ly = ds.pixel_array.shape # beginning of operation 
     X, Y = np.ogrid[0:lx, 0:ly] 
     mask = (X - lx/2)**2 + (Y - ly/2)**2 < lx*ly/8 
     array = ds.pixel_array[mask] 
     if array.all(): 
      st_dev = np.std(array) # end of operation 
      rec_3.append(st_dev) 
    rec_3_avg = np.mean(rec_3) 
    dic.update({os.path.basename(root):rec_3_avg}) 

print dic 
+0

"if array: ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()" – Foodaaaay

+0

, что является целью "if dirname.startswith ('. '): dirs.remove (dirname) "lines? – Foodaaaay

+0

Кажется, что у вас есть некоторые подкаталоги конфигурации (.spyder2) в каталоге, в котором вы запускаете это. Это заставляет скрипт не перебирать эти вспомогательные каталоги (любой каталог, начинающийся с. (Например, /.spyder2) – jbh

Смежные вопросы