用最后一个元素填充列表的嵌套列表中的缺失值

时间:2019-11-25 15:11:24

标签: python numpy

我有一个图像的numpy数组,但是它不完整,看起来像这样:

[
[255,255,255],
[128],
[34,4],
[44]
]

我想添加特定元素的先前值以完成该元素,如下所示:

[
[255,255,255],
[128,128,128],
[34,4,4],
[44,44,44]
]

那么,如何为特定元素添加值? 关键是,我需要每个元素块来完成其自身功能

2 个答案:

答案 0 :(得分:4)

方法1

这是基于this post-

def fill_by_last_val(a):
    lens = np.array([len(item) for item in a])
    ncols = lens.max()
    last_ele = np.array([a_i[-1] for a_i in a])
    out = np.repeat(last_ele[:,None],ncols,axis=1)
    mask = lens[:,None] > np.arange(lens.max())
    out[mask] = np.concatenate(a)
    return out

方法2

另一个基于itertools-

import itertools

def fill_by_last_val_v2(a):
    last_ele = np.array([a_i[-1] for a_i in a])
    a_f = np.array(list(itertools.zip_longest(*a,fillvalue=0))).T
    m = np.minimum.accumulate((a_f==0)[:,::-1],axis=1)[:,::-1]
    return m*last_ele[:,None]+a_f

方法3

另一个具有pandas数据帧且假定输入中没有NaNs的人-

import pandas as pd

def fill_by_last_val_v3(a):
    df = pd.DataFrame(a)
    m = df.isnull()
    last_ele = np.array([a_i[-1] for a_i in a])
    return np.where(m,last_ele[:,None],df)

方法4

再次使用pandas最简单-

In [168]: a
Out[168]: [[255, 255, 255, 5], [128, 5, 6], [34, 0, 7], [nan, 44]]

In [169]: pd.DataFrame(a).ffill(axis=1).to_numpy()
Out[169]: 
array([[255., 255., 255.,   5.],
       [128.,   5.,   6.,   6.],
       [ 34.,   0.,   7.,   7.],
       [ nan,  44.,  44.,  44.]])

您可能希望进行dtype转换,尽管具有pandas解决方案的原始数据类型。

答案 1 :(得分:1)

我提出了一个快速的解决方案,可以满足您的要求:

clean_df = melted_df.replace('', np.nan).dropna()

让我知道是否足够或您可以共享更多详细信息。