Есть ли более эффективный способ кодирования каждой строки, чем использование al oop? - PullRequest
0 голосов
/ 29 апреля 2020

То, что я пытаюсь сделать

У меня есть набор данных, где в каждом ряду команда из 11 игроков, каждый из которых представлен номером своей футболки. Например, команда А может состоять из [1, 66, 22, 4, 26, 3, 18, 8, 9, 11, 10]. Возможные номера рубашек варьируются от 0 до 99, и я хотел бы затем представить команды с вектором размером 100, где индексы, соответствующие номерам рубашек, отмечены 1с, а остальные 0. Команда А, например, будет тогда:

[0., 1., 0., 1., 1., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 0.,
 0., 1., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,
 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,
 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]

Что я пробовал

Я реализовал это преобразование с помощью простой функции:

def encode_lineup(kit_numbers, squad_size=100):
    encoded_lineup = np.zeros(squad_size)
    encoded_lineup[kit_numbers] = 1
    return encoded_lineup

Теперь, пытаясь расширить эту реализацию на несколько команд (массив команд), я не смог придумать ничего лучше, чем al oop, например:

all_encoded_lineups = np.zeros(number_of_teams, squad_size)

for i in range(number_of_teams):
    all_encoded_lineups[i] = encode_lineup(teams[i], squad_size)

Какая мне нужна помощь с

Я хотел бы сделать это более эффективно, если это возможно - знаете ли вы какие-либо предложения по векторизации этой реализации или какие-либо другие идеи?

Заранее спасибо!

1 Ответ

1 голос
/ 30 апреля 2020

Возможно, используйте функцию put :

#!/usr/bin/env python

import numpy as np

a = np.array([1, 2, 3, 4, 5])
replace_with_value = -1
replace_at_indices = [1, 4]
np.put(a, replace_at_indices, replace_with_value)
print(a)
'''                                                                                                                                                                              
[1 -1 3 4 -1]                                                                                                                                                                    
'''

Ваша логика c (чем бы она ни была) создаст вектор индексов, в котором вы замените нули на что-то еще.

Чтобы распространить это на многомерные массивы, вы можете flatten, put и reshape, как предлагается здесь: { ссылка }

...