python给列表做固定长度的截断并padding到指定长度

2022-05-17   565 次阅读


其实是在工作时用到的一个代码,一开始仅仅为了快点写出来,处理的也是小数据,就写了惨不忍睹的一版。后来换了大数据了,需要跑两三分钟的数据预处理,这样的时间就是不能接受的了。
所以花了一上午+下午半个小时写了改进后的,现在也就需要10秒左右,做训练和测试都快了特别多。这样的任务场景估计不少见,但相应的函数却没有。所以在这里做个记录,也方便以后取用

可以简单修改后直接用哦

def newCutOff(List,leng,Type):
    a = []
    for i in range(len(List)):
        a.extend([List[i][j: j + leng] for j in range(0, len(List[i]), leng)])

    seq_len = []
    for i in range(len(a)):
        seq_len.extend([len(a[i])])
    for i in range(len(a)):
        if len(a[i])<leng:
            if Type=='x':
                a[i].extend([wordVector[0] for i in range(leng-len(a[i]))])
            if Type=='y':
                a[i].extend([0 for i in range(leng-len(a[i]))])
    return a,seq_len

测试结果大概是这样的,还可以自己改
image.png

你想分析分析什么是能运行的屎?。。

def cutOff(a,leng,Type):
    import copy
    temp = copy.deepcopy(a)

    iter_num_count = 0
    for i in range(len(temp)):
        del a[iter_num_count]
        if len(temp[i]) / leng > int(len(temp[i]) / leng):
            iter_num = int(len(temp[i]) / leng) + 1
        elif len(temp[i]) / leng==int(len(temp[i]) / leng):
            iter_num = int(len(temp[i]) / leng)
        elif len(temp[i]) / leng < int(len(temp[i]) / leng):
            assert (1 == -1)

        for j in range(iter_num):
            a.insert(iter_num_count, temp[i][0 + leng * j:leng + leng * j])
        iter_num_count += iter_num
    seq_len = copy.deepcopy(a)
    for i in range(len(a)):
        seq_len[i] = len(seq_len[i])

    for i in range(len(a)):
        if len(a[i])<leng:
            if Type=='x':
                a[i].extend([wordVector[0] for i in range(leng-len(a[i]))])
            if Type=='y':
                a[i].extend([0 for i in range(leng-len(a[i]))])
    return seq_len

上面那个就是。。deepcopy乱用,太傻了

最近改进方法

不准重复造轮子!

from torch.nn.utils.rnn import pad_sequence

pad_sequence([torch.from_numpy(np.array(x)) for x in conv_x]
# ↑完美解决问题

# ↓顺便记一下
packed = pack_padded_sequence(x, seq_len, batch_first=True, enforce_sorted=False)
x, lens_x = pad_packed_sequence(packed, batch_first=True)

# ↑padded和packed,专门用于RNN里,pytorch中。具体的有空写个整合版本的

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

无论在未来前做什么,未来都会普通的到来