2016-04-28 13 views
2

特定の軸に対して、numpyを使用して一致するブール値マスクに基づいて、グローバル2D配列からnp.arraysのリスト(またはnp.array)を生成することに興味があります。 np.ma.mask()または同様のを使用することができれば、私はマスクに基づくグローバル配列のサブセットのナンシー生成

例は、おそらく優れている...と思いまして:

number= 10 
x = np.linspace(0,number,num=number+1,dtype=int) 
B = np.vstack((x%3==0, x%2==0, x%1==0)) 
X = np.vstack((x//3, x//2, x-1)) 

list_ = [] 
for i in range(1,number+1): 
    pointer = X[:,i][B[:,i]] 
    list_.append(pointer) 

print(list_) 
[array([0]), array([1, 1]), array([1, 2]), array([2, 3]), array([4]), array([2, 3, 5]), array([6]), array([4, 7]), array([3, 8]), array([5, 9])] 

forループ、私は基本的に軸上の値を抽出していて= 1、2次元配列Xの場合、ブール値マスクBに基づいています。これは軸= 0を反復し、X [:、i] [B [:、i]]を選択することで実現します。範囲が非常に大きくなり、npy.ma.array(X、mask = B)のwhereステートメントを使用してnumpyで完全に行うことができるので、ループなしでこれを行うことが可能かどうか疑問に思っていますか?

乾杯!ここで

答えて

1

は、私はベクトル化された方法で事件を解決するためにたどるステップです -

  1. Xから有効な要素を選択するboolean indexingを使用してください。
  2. 入力マスクに対して列インデックスがシフトしているインデックスを取得します。これは、np.whereを使用し、最初の入力argを選択して、マスクを転置した後に達成されます。

    cut_idx = np.unique(np.where(B[:,1:].T)[0],return_index=True)[1] 
    out_list_ = np.split(X[:,1:].T[B[:,1:].T],cut_idx[1:]) 
    
    -
  3. 最後に、これらのインデックスと、実装は次のようになり、ステップ1

で得られた有効な要素のアレイを分割しました

関連する問題