2024-05-01 21:57:17 发布
网友
我有一个图像的numpy数组,但它不完整,它看起来像这样:
[ [255,255,255], [128], [34,4], [44] ]
我想将特定元素的前一个值添加到已完成的元素中,如下所示:
[ [255,255,255], [128,128,128], [34,4,4], [44,44,44] ]
那么,如何向特定元素添加值呢? 关键是,我需要每个元素块完成它自己
进近#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-
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
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])
让我知道,如果这是足够的或有更多的细节,你可以分享。你知道吗
进近#1
这是一个基于^{} -
进近#2
另一个基于
itertools
-进近#3
另一个是
pandas
数据帧,假设输入中没有NaNs
进近#4
最简单的一批
pandas
您可能希望进行数据类型转换,以获得
pandas
解决方案的原始数据类型。你知道吗我做了一个快速的解决方案,可以满足您的要求:
让我知道,如果这是足够的或有更多的细节,你可以分享。你知道吗
相关问题 更多 >
编程相关推荐