考慮名單l
有效地轉換列表的不均勻名單與南填補
l = [[1, 2, 3], [1, 2]]
列表最小含數組,如果我將它轉換爲一個np.array
我將在第一個拿到一個維對象數組與[1, 2, 3]
位置和[1, 2]
在第二位置。
print(np.array(l))
[[1, 2, 3] [1, 2]]
我想這不是
print(np.array([[1, 2, 3], [1, 2, np.nan]]))
[[ 1. 2. 3.]
[ 1. 2. nan]]
我可以用一個循環做到這一點,但我們都知道循環多麼不受歡迎是
def box_pir(l):
lengths = [i for i in map(len, l)]
shape = (len(l), max(lengths))
a = np.full(shape, np.nan)
for i, r in enumerate(l):
a[i, :lengths[i]] = r
return a
print(box_pir(l))
[[ 1. 2. 3.]
[ 1. 2. nan]]
如何我要這樣做嗎?以一種快速,矢量化的方式?
定時
設置功能
%%cython
import numpy as np
def box_pir_cython(l):
lengths = [len(item) for item in l]
shape = (len(l), max(lengths))
a = np.full(shape, np.nan)
for i, r in enumerate(l):
a[i, :lengths[i]] = r
return a
def box_divikar(v):
lens = np.array([len(item) for item in v])
mask = lens[:,None] > np.arange(lens.max())
out = np.full(mask.shape, np.nan)
out[mask] = np.concatenate(v)
return out
def box_hpaulj(LoL):
return np.array(list(zip_longest(*LoL, fillvalue=np.nan))).T
def box_simon(LoL):
max_len = len(max(LoL, key=len))
return np.array([x + [np.nan]*(max_len-len(x)) for x in LoL])
def box_dawg(LoL):
cols=len(max(LoL, key=len))
rows=len(LoL)
AoA=np.empty((rows,cols,))
AoA.fill(np.nan)
for idx in range(rows):
AoA[idx,0:len(LoL[idx])]=LoL[idx]
return AoA
def box_pir(l):
lengths = [len(item) for item in l]
shape = (len(l), max(lengths))
a = np.full(shape, np.nan)
for i, r in enumerate(l):
a[i, :lengths[i]] = r
return a
def box_pandas(l):
return pd.DataFrame(l).values
@piRSquared列表理解在性能上會比'map'更好嗎? – Divakar
@piRSquared啊不,沒關係。另外,我不知道那個'map'可能存在兼容性問題。所以,我認爲這是一個公平的編輯。看到一些運行時測試肯定會很有趣! – Divakar
@piRSquared可愛,真正全面的基準測試!正如我在所有數據庫中看不到明確的贏家。儘管如此,比賽仍然很好 – Divakar