2013-11-07 3 views
1

У меня есть массив из 60000 чисел от 0-9:Vectorize эта функция в Python Numpy

In [1]: trainY 
Out[1]: 
array([[5], 
     [0], 
     [4], 
     ..., 
     [5], 
     [6], 
     [8]], dtype=int8) 

И у меня есть функция, чтобы преобразовать каждый элемент в trainY в вектор 10 элемента согласно ниже:

0 -> [1,0,0,0,0,0,0,0,0,0] 
1 -> [0,1,0,0,0,0,0,0,0,0] 
2 -> [0,0,1,0,0,0,0,0,0,0] 
3 -> [0,0,0,1,0,0,0,0,0,0] 
... 
9 -> [0,0,0,0,0,0,0,0,0,1] 

функция:

def transform_y(y): 
    new_y = np.zeros(10) 
    new_y[y] = 1 
    return new_y 

Мой код работает только 1 элемент одновременно. Каков наилучший способ преобразования моего массива trainY сразу (кроме цикла for)? Должен ли я использовать map? Может ли кто-нибудь показать мне, как переписать функцию так, чтобы она была проиндексирована?

спасибо.

ответ

4

Вы можете значительно улучшить вашу скорость кода создания массива 2-D с единицами по диагонали, а затем извлечь правильные строки, основанные на входная матрица:

a = array([[5], 
      [0], 
      [4], 
      ..., 
      [5], 
      [6], 
      [8]], dtype=int8) 

new_y = np.eye(a.max()+1)[a.ravel()] 

Еще более быстрым решением было бы создать выходной массив с нулями, а затем заполнить его в соответствии с Ординг индексов от a:

new_y = np.zeros((a.shape[0], a.max()+1)) 
new_y[np.indices(a.ravel().shape)[0], a.ravel()] = 1. 
+1

Правда, я даже не читать код ;-) Ваш ответ представляет собой лучшее решение для его настоящего дела, но я держу мину как более общий ответ. – Bruce

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