有没有比使用循环更有效的编码每一行的方法?

Is there a more efficient way of encoding every row than using a loop?

我在尝试什么

我有一个数据集,其中每一行都是一个由 11 名球员组成的球队,每个球员都由他们的球衣号码表示。例如,A 队可能包括 [1, 66, 22, 4, 26, 3, 18, 8, 9, 11, 10]。可能的球衣号码范围从 0 到 99,然后我想用大小为 100 的向量表示球队,其中与球衣号码对应的索引用 1 标记,其他的用 0 标记。例如,A 队将是:

[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

现在,在尝试将此实现扩展到多个团队(一组团队)时,我想不出比这样的循环更好的方法:

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)

我需要什么帮助

如果可能的话,我想更有效地做到这一点 - 你知道对矢量化这个实现有什么建议,或者任何其他想法吗?

提前致谢!

也许使用 put function:

#!/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]                                                                                                                                                                    
'''

您的逻辑(无论它是什么)将创建一个索引向量,您可以在其中用其他内容替换零。

要将其扩展到多维数组,您可以 flattenputreshape,如此处所建议: