gpt4 book ai didi

python - 单热编码 : list membership error

转载 作者:行者123 更新时间:2023-11-28 22:25:05 25 4
gpt4 key购买 nike

给定数量可变的字符串,我想对它们进行单热编码,如下例所示:

s1 = 'awaken my love'
s2 = 'awaken the beast'
s3 = 'wake beast love'

# desired result - NumPy array
array([[ 1., 1., 1., 0., 0., 0.],
[ 1., 0., 0., 1., 1., 0.],
[ 0., 0., 1., 0., 1., 1.]])

当前代码:

def uniquewords(*args):
"""Create order-preserved string with unique words between *args"""
allwords = ' '.join(args).split()
return ' '.join(sorted(set(allwords), key=allwords.index)).split()

def encode(*args):
"""One-hot encode the given input strings"""
unique = uniquewords(*args)
feature_vectors = np.zeros((len(args), len(unique)))
for vec, s in zip(feature_vectors, args):
for num, word in enumerate(unique):
vec[num] = word in s
return feature_vectors

问题出在这一行:

vec[num] = word in s

例如,'wake' in 'awaken my love'True(正确,但不符合我的需要)并给出以下内容,略有偏差的结果:

print(encode(s1, s2, s3))
[[ 1. 1. 1. 0. 0. 1.]
[ 1. 0. 0. 1. 1. 1.]
[ 0. 0. 1. 0. 1. 1.]]

我看过 a solution使用 re 但不确定如何在此处应用。我怎样才能纠正上面的一行? (摆脱嵌套循环也很好,但我不要求进行一般代码编辑,除非有人友善地提供。)

最佳答案

这是一种方法-

def membership(list_strings):
split_str = [i.split(" ") for i in list_strings]
split_str_unq = np.unique(np.concatenate(split_str))
out = np.array([np.in1d(split_str_unq, b_i) for b_i in split_str]).astype(int)
df_out = pd.DataFrame(out, columns = split_str_unq)
return df_out

sample 运行-

In [189]: s1 = 'awaken my love'
...: s2 = 'awaken the beast'
...: s3 = 'wake beast love'
...:

In [190]: membership([s1,s2,s3])
Out[190]:
awaken beast love my the wake
0 1 0 1 1 0 0
1 1 1 0 0 1 0
2 0 1 1 0 0 1

这是另一个使用 np.searchsorted 来获取每行的列索引以设置到输出数组中并希望更快 -

def membership_v2(list_strings):
split_str = [i.split(" ") for i in list_strings]
all_strings = np.concatenate(split_str)
split_str_unq = np.unique(all_strings)
col = np.searchsorted(split_str_unq, all_strings)
row = np.repeat(np.arange(len(split_str)) , [len(i) for i in split_str])
out = np.zeros((len(split_str),col.max()+1),dtype=int)
out[row, col] = 1
df_out = pd.DataFrame(out, columns = split_str_unq)
return df_out

请注意,作为数据帧的输出主要是为了更好/更轻松地表示输出。

关于python - 单热编码 : list membership error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45804686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com