Multible для петель, зависящих друг от друга более питоническим способом - PullRequest
0 голосов
/ 08 июня 2018

Уважаемые Stackoverflowers,

Я написал рабочий цикл в цикле, который проходит через ndarrays в списке.Мне было интересно, если есть более элегантное решение "pythonisch".

Если есть решение со списком, не могли бы вы объяснить его шаг за шагом, чтобы я мог следовать и учиться?Я пробовал, но цикл for, зависящий от цикла for, у меня не работал.

  • У меня есть список y_labeled , где каждый элемент списка i ndarray j элементов.
  • У меня есть dict с различными значениями веса.Ключи значений можно найти в y_labeled . y_labeled также содержит значение маскирования 0 [Здесь я попытался установить get (key, default = 0), но это привело к ошибке, поэтому я использовал if].

СейчасЯ перебираю каждый y_labeled элемент списка-> через каждый элемент массива и сохраняю соответствующий вес в новом списке weight , созданный снова из ndarrays.

Цель состоит в том, чтобысоздайте другой список, такой как y_labeled , содержащий соответствующие значения веса (вы, возможно, догадались -> его sample_weigth).

   weigth=list();tmp2=[]
   for i in range(len(y_labeled)):
          for j in range(len(y_labeled[i])):               
                 for k in (y_labeled[i][j]):
                        if k !=0:
                               tmp=weights_dict.get(y_labeled[i].item(np.asscalar(k)))
                        else:
                               tmp=0                                                                           
                        tmp2.append(tmp)
          weigth.append(tmp2); tmp=[];tmp2=[]  

Большое спасибо

Редактировать: некоторые примеры данных:

y_labeled=list([1,2,2,4,4,1,1],[2,1,1,4,4,0,0],[2,2,2,2,0,0,0])

weights_dict={1:5, 2:6, 4:19}

Результат:

weight=list([5,6,6,19,19,5,5],[6,5,5,19,19,0,0],[6,6,6,6,0,0,0])

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Использование вложенных списочных представлений :

>>> y_labeled = [[1,2,2,4,4,1,1], [2,1,1,4,4,0,0], [2,2,2,2,0,0,0]]
>>> weights_dict = {1:5, 2:6, 4:19}
>>> [[weights_dict.get(x, 0) for x in sublist] for sublist in y_labeled]
[[5, 6, 6, 19, 19, 5, 5], [6, 5, 5, 19, 19, 0, 0], [6, 6, 6, 6, 0, 0, 0]]
0 голосов
/ 08 июня 2018

Наконец-то понял тему .... Вот решение, использующее numpy и работающее с NDarrays.

# -*- coding: utf-8 -*-

import numpy as np

y_labeled = [np.random.randint(low = 0, high = 10, size = (5, 2)),
             np.random.randint(low = 0, high = 10, size = (5, 2)),
             np.random.randint(low = 0, high = 10, size = (5, 2))]

weights = np.random.randint(low = 0, high = 10, size = (10, ))
weights_dict = {i:weights[i] for i in range(10)}

results = list()
for y_mat in y_labeled:
    weight_matrix = np.zeros(shape = y_mat.shape)
    for i in range(10):
        weight_matrix[y_mat == i] = weights_dict[i]

    results.append(weight_matrix)
0 голосов
/ 08 июня 2018

Решение с использованием индексации с массивами numpy:

import numpy as np
y_labeled=[np.array([1,2,2,4,4,1,1]),
           np.array([2,1,1,4,4,0,0]),
           np.array([2,2,2,2,0,0,0])]

# Convert dictionary to numpy array
weights_dict={1:5, 2:6, 4:19}
weight_vector = np.zeros(max(weights_dict.keys()) + 1)
for k, v in weights_dict.items():
    weight_vector[k] = v

print("Weight vector")
print(weight_vector)


# use y_labeled to select the coefficients of weight_matrix
weight = [weight_vector[y] for y in y_labeled]

print("Output weight")
for w in weight:
    print(w)

Вывод:

Weight vector
[ 0.  5.  6.  0. 19.]
Output weight
[ 5.  6.  6. 19. 19.  5.  5.]
[ 6.  5.  5. 19. 19.  0.  0.]
[6. 6. 6. 6. 0. 0. 0.]
...