2015-09-23 84 views
1

假設有兩個數組,vals包含值,masks包含布爾值,指示是否使用valsnan s中的值。目標是構建一個長度與masks相同長度的數組ret,其中包含vals的值,位於masksTrue條目的相應位置。「Unsparsing」numpy Arrays with Given Masks

例如,假設

vals = np.array([1, 2]) 
masks = [True, False, False, True] 

然後ret,返回值,應該是

array([1, None, None, 2], dtype=object) 

這顯然是很容易做到的使用循環:

import numpy as np 

def unsparse(vals, masks): 
    vals_i = 0 
    ret = [] 
    for m in masks: 
     if m: 
      ret.append(vals[vals_i]) 
      vals_i += 1 
     else: 
      ret.append(None) 
    return np.array(ret) 

>> unsparse(np.array([1, 2]), [True, False, False, True]) 
array([1, None, None, 2], dtype=object) 

是有沒有辦法做到沒有循環,更簡潔?

+0

你真的想要的那個陣列中沒有'?你打算做什麼計算? – hpaulj

回答

2

你可以做這樣的事情 -

out = np.empty(masks.shape,dtype=object) 
out[masks] = vals[:masks.sum()] 

請注意,:masks.sum()選擇從vals,其中N是口罩TRUE元素數量第一N元素。

如果它保證了TRUE元素的數量是相同vals元素的個數,那麼你可能只是簡單地做 -

out[masks] = vals 

採樣運行 -

In [34]: vals = np.array([1, 2, 6, 8, 9]) 
    ...: masks = np.array([True, False, False, True, False, True]) 
    ...: 

In [35]: out = np.empty(masks.shape,dtype=object) 
    ...: out[masks] = vals[:masks.sum()] 
    ...: 

In [36]: out 
Out[36]: array([1, None, None, 2, None, 6], dtype=object) 
+0

優秀。非常感謝! –