<p><strong>进近#1</strong></p>
<p>这是一个基于<a href="https://stackoverflow.com/a/40571482/">^{<cd1>}</a>-</p>
<pre><code>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
</code></pre>
<p><strong>进近#2</strong></p>
<p>另一个基于<code>itertools</code>-</p>
<pre><code>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
</code></pre>
<p><strong>进近#3</strong></p>
<p>另一个是<code>pandas</code>数据帧,假设输入中没有<code>NaNs</code></p>
<pre><code>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)
</code></pre>
<p><strong>进近#4</strong></p>
<p>最简单的一批<code>pandas</code></p>
<pre><code>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.]])
</code></pre>
<p>您可能希望进行数据类型转换,以获得<code>pandas</code>解决方案的原始数据类型。你知道吗</p>