2017-10-01 27 views
2

次numpy.where配列を操作する方法:私は次のように見えるインデックスの配列を持っている

(array([ 249, 250, 251, 252, 253, 254, 804, 805, 806, 807, 808, 
     809, 1365, 1366, 1367, 1368, 1369, 1860, 1861, 1862, 1863, 1864, 
     2424, 2425, 2426, 2427, 2428, 2948, 2949, 2950, 2951, 2952, 2953, 
     3501, 3502, 3503, 3504, 3505, 3506, 4061, 4062, 4063, 4064, 4065, 
     4555, 4556, 4557, 4558, 4559, 5111, 5112, 5113, 5114, 5115, 5116, 
     6188, 6189, 6190, 6191, 6752, 6753, 6754, 6755, 6756, 7261, 7262, 
     7263, 7264, 7265, 7821, 7822, 7823, 7824, 7825, 7826, 8385, 8386, 
     8387, 8388, 8389]),) 

この配列は、基本的でディップである:以下の配列を与える

indices=np.where(f!=1) 

光のカーブ。私は、各ディップの両側に2つ以上のインデックスを選択したいと思います。

(array([ **247, 248**, 249, 250, 251, 252, 253, 254, **255, 256**, **802, 803**, 804, 805, 806, 807, 808, 809, **810, 811** etc....]),) 
+0

何 'のように見えるF'ないため、これらの6行を入れ替えることができますか? –

+0

ディップが互いに隣り合っているとどうなりますか?あなたはインデックスを繰り返したいと思っていますか? – Eric

答えて

0

まずオフ、との配列としてインデックスを取得::だから、本質的に配列は、以下のようになりますので

indices=np.where(f!=1)[0] # or use np.flatnonzero 

、我々は持っているだろう -

In [804]: indices 
Out[804]: 
array([ 249, 250, 251, 252, 253, 254, 804, 805, 806, 807, 808, 
     809, 1365, 1366, 1367, 1368, 1369, 1860, 1861, 1862, 1863, 1864, 
     2424, 2425, 2426, 2427, 2428, 2948, 2949, 2950, 2951, 2952, 2953, 
     3501, 3502, 3503, 3504, 3505, 3506, 4061, 4062, 4063, 4064, 4065, 
     4555, 4556, 4557, 4558, 4559, 5111, 5112, 5113, 5114, 5115, 5116, 
     6188, 6189, 6190, 6191, 6752, 6753, 6754, 6755, 6756, 7261, 7262, 
     7263, 7264, 7265, 7821, 7822, 7823, 7824, 7825, 7826, 8385, 8386, 
     8387, 8388, 8389]) 

次のアップ、それらのそれぞれのディップの開始位置と停止位置を取得する必要があります。その後、broadcastingで拡張番号を取得します。最後に、連結と並べ替えでそれらを挿入します。

したがって、実装は次のようになります -

idx = np.r_[0,np.flatnonzero(np.diff(indices) > 1)+1,len(indices)] 
start_pad = indices[idx[:-1]][:,None] + range(-2,0) 
stop_pad = indices[idx[1:]-1][:,None] + range(1,3) 
out = np.sort(np.r_[start_pad.ravel(), indices, stop_pad.ravel()]) 

出力は次のようになります - あなたは完全にwhere/nonzeroを使用しないようにしたいかもしれません

In [832]: out 
Out[832]: 
array([ 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 802, 
     803, 804, 805, 806, 807, 808, 809, 810, 811, 1363, 1364, 
     1365, 1366, 1367, 1368, 1369, 1370, 1371, 1858, 1859, 1860, 1861, 
     1862, 1863, 1864, 1865, 1866, 2422, 2423, 2424, 2425, 2426, 2427, 
     2428, 2429, 2430, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 
     2954, 2955, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 
     3508, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4553, 
     4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 5109, 5110, 5111, 
     5112, 5113, 5114, 5115, 5116, 5117, 5118, 6186, 6187, 6188, 6189, 
     6190, 6191, 6192, 6193, 6750, 6751, 6752, 6753, 6754, 6755, 6756, 
     6757, 6758, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 
     7819, 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 8383, 
     8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391]) 
+0

ありがとうございました!私はコーディングに新しいので、まだすべてを理解しようとしています。 indices = np.where(f!= 1)[0] indices_1 = [x + 2のインデックスでは、次のように試してみてください。 ] indices_2 = [インデックスのxのx-2] indices_new = sorted(list(set(indices_1)| set(indices_2))) これもうまくいくようです。あなたの時間と反応に感謝します。私は本当にあなたの説明をありがとう! – kassellick

+0

@kassellick私はあなたがリストアップしたループを回避しようとしていましたが、主にパフォーマンスのために:)あなたの問題が解決した場合は、空洞のダニをクリックして受け入れることを検討してください。詳細はこちら - https://stackoverflow.com/help/someone-answers – Divakar

0

dip = f != 1 

# below is `scipy.ndimage.morphology.binary_dilation(dip, iterations=2)` 
dip_adj1 = dip.copy() 
dip_adj1[1:] |= dip[:-1] 
dip_adj1[:-1] |= dip[1:] 

dip_adj2 = dip_adj1.copy() 
dip_adj2[1:] |= dip_adj1[:-1] 
dip_adj2[:-1] |= dip_adj1[1:] 

dip_adj2ですboolの配列Trueを保管したい場所に保管してください。インデックスが本当に必要な場合はnp.nonzero(dip_adj2)に電話することができます。あなたはscipyのダウンロードを使用している場合

、あなたはbinary_dilation

関連する問題