序列列表与稀疏矩阵的转换

import numpy as np
import string
chars=string.ascii_lowercase
chars
'abcdefghijklmnopqrstuvwxyz'
char2num={v:k for k,v in enumerate(chars)}
num2char={k:v for k,v in enumerate(chars)}
#输入'abc','de'对应在chars中的索引‘012’,‘34’
inputs=['hello','tom']
inputs=[[char2num[item1] for item1 in item0] for item0 in inputs]
inputs
#[[7, 4, 11, 11, 14], [19, 14, 12]]
# 转化一个序列列表为稀疏矩阵
def sparse_tuple_from(sequences, dtype=np.int32):    
    indices = []
    values = []
    for n, seq in enumerate(sequences):
        indices.extend(zip([n] * len(seq), range(len(seq))))
        values.extend(seq)

    indices = np.asarray(indices, dtype=np.int64)
    values = np.asarray(values, dtype=dtype)
    shape = np.asarray([len(sequences), np.asarray(indices).max(0)[1] + 1], dtype=np.int64)
    return indices, values, shape
sparse_tensor=sparse_tuple_from(inputs)
sparse_tensor
# (array([[0, 0],
#            [0, 1],
#            [0, 2],
#            [0, 3],
#            [0, 4],
#            [1, 0],
#            [1, 1],
#            [1, 2]], dtype=int64),
#     array([ 7,  4, 11, 11, 14, 19, 14, 12]),
#     array([2, 5], dtype=int64))
def decode_sparse_tensor(sparse_tensor):
    decoded_indexes = list()
    current_i = 0
    current_seq = []
    for offset, i_and_index in enumerate(sparse_tensor[0]):
        i = i_and_index[0]
        if i != current_i:
            decoded_indexes.append(current_seq)
            current_i = i
            current_seq = list()
        current_seq.append(offset)
    decoded_indexes.append(current_seq)
    result = []
    for item in decoded_indexes:
        result.append([sparse_tensor[1][index] for index in item])
    return result
decoded_indexes=decode_sparse_tensor(sparse_tensor)
decoded_indexes
#[[7, 4, 11, 11, 14], [19, 14, 12]]
outputs=[[num2char[index] for index in item] for item in decoded_indexes]
outputs
#[['h', 'e', 'l', 'l', 'o'], ['t', 'o', 'm']]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值