我想找到開始並且在一個numpy的陣列或優選大熊貓數據幀停止相同的值的塊的索引(塊沿着所述列的2D陣列,並且沿着維數組的最快速變化的索引)。我只在一個維度上查找塊,並且不想在不同行上聚集nans。查找開始和連續值的級間以方框的Python/numpy的/大熊貓
從這個問題(Find large number of consecutive values fulfilling condition in a numpy array)開始,我寫了下面溶液發現np.nan用於2D陣列:
import numpy as np
a = np.array([
[1, np.nan, np.nan, 2],
[np.nan, 1, np.nan, 3],
[np.nan, np.nan, np.nan, np.nan]
])
nan_mask = np.isnan(a)
start_nans_mask = np.hstack((np.resize(nan_mask[:,0],(a.shape[0],1)),
np.logical_and(np.logical_not(nan_mask[:,:-1]), nan_mask[:,1:])
))
stop_nans_mask = np.hstack((np.logical_and(nan_mask[:,:-1], np.logical_not(nan_mask[:,1:])),
np.resize(nan_mask[:,-1], (a.shape[0],1))
))
start_row_idx,start_col_idx = np.where(start_nans_mask)
stop_row_idx,stop_col_idx = np.where(stop_nans_mask)
這讓我例如施加之前分析缺失值的貼片的長度的分佈pd.fillna。
stop_col_idx - start_col_idx + 1
array([2, 1, 1, 4], dtype=int64)
再舉一個例子和預期結果:
a = np.array([
[1, np.nan, np.nan, 2],
[np.nan, 1, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan]
])
array([2, 1, 2, 4], dtype=int64)
,而不是
array([2, 1, 6], dtype=int64)
我的問題有以下幾點:
- 有沒有辦法來優化我的解決方案(尋找開始和結束在一次傳遞掩碼/在哪裏操作)?
- 是否有大熊貓更優化的解決方案嗎? (即,不同的解決方案不是僅僅施加掩模/其中的數據幀的值)
- 時會發生什麼底層陣列或數據幀是要大,以適應存儲器?
不錯的小片段......實際上這對ndim = 1也不應該太過分了。 – goofd 2014-06-19 21:25:37