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

2024-05-01 21:57:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想将特定元素的前一个值添加到已完成的元素中,如下所示:

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

那么,如何向特定元素添加值呢? 关键是,我需要每个元素块完成它自己


Tags: 图像numpy元素数组关键
2条回答

进近#1

这是一个基于^{}-

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.]])

您可能希望进行数据类型转换,以获得pandas解决方案的原始数据类型。你知道吗

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

A = np.array([[255,255,255],
              [128],
              [34,4],
              [44]])

# lenA can be changed depending on the preferred dimensions
lenA = len(A) - 1 
np.array([b if len(b) == lenA else b + [b[-1]]*(lenA - len(b)) for b in A])

让我知道,如果这是足够的或有更多的细节,你可以分享。你知道吗

相关问题 更多 >