2016-07-30 12 views
1

に適用しました並べ替えられた配列のうち、nansを除外します。この場合、私は[6,3]を取得したいと思います。選択値は、次の配列</p>ので、同じように生成される <pre><code>array([ nan, nan, nan, 1., nan, nan, 0., nan, nan]) </code></pre> <p>以降で別の配列

私はこれを行うには、次の方法を作ってみた:今

vals = np.sort(row) 
inds = np.argsort(row) 

def select_index_by_value(indices, values): 
    selected_indices = [] 
    for i in range(len(indices)): 
     if not np.isnan(values[i]): 
      selected_indices.append(indices[i]) 
    return selected_indices 

selected_inds = select_index_by_value(inds, vals) 

selected_inds[6,3]です。しかし、これは簡単なことを達成するためのかなりの数行のコードのようです。おそらくこれを行うためのより短い方法はありますか?

答えて

1

別のオプション:

row.argsort()[~np.isnan(np.sort(row))] 
# array([6, 3]) 
+0

どちらのソリューションも動作しますが、Numpyの 'where'よりもより洗練されたブールインデックスを使用しています。ありがとう! –

3

あなたはこのような何か行うことができます -

# Store non-NaN indices 
idx = np.where(~np.isnan(row))[0] 

# Select non-NaN elements, perform argsort and use those argsort  
# indices to re-order non-NaN indices as final output 
out = idx[row[idx].argsort()] 
0

(OPデータのための)別の高速化ソリューションがありますが。

Psidomのソリューション

%timeit row.argsort()[~np.isnan(np.sort(row))] 

The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 8.16 µs per loop 

Divakarのソリューション

%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()] 

The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 4.73 µs per loop 
Divakarのソリューションに基づいて

%timeit np.where(~np.isnan(row))[0][::-1] 

The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 2.86 µs per loop 

私はnp.where(~np.isnan(row))は順序を保持しているため、これはうまくいくと思います。

関連する問題