我有一个图像的numpy数组,但是它不完整,看起来像这样:
[
[255,255,255],
[128],
[34,4],
[44]
]
我想添加特定元素的先前值以完成该元素,如下所示:
[
[255,255,255],
[128,128,128],
[34,4,4],
[44,44,44]
]
那么,如何为特定元素添加值? 关键是,我需要每个元素块来完成其自身功能
答案 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()
让我知道是否足够或您可以共享更多详细信息。