2017-03-22 14 views
1

私は1次元配列を持ち、このような最後の値を探したいと思っています。最後の値をnumpy配列で見つける

a = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]) 
# find the index that value(7) last appear. 
np.argwhere(a >= 7).max() 
# output 10 

しかし、それは1dアレイと3次元アレイについてはスーツです。

b = np.tile(a.reshape(15,1,1), reps=(1,30,30)) 
# now b is 3d array and i want to use same way to the axis = 0 in 3d array. 
np.argwhere(b >= 7) 
# return a 2d array. It's not what i need. 

私は 'for'ループをもう一方の軸として使用できますが、効率的にnumpyで解決したいと思います。

すべての
+0

@StephenRauch申し訳ありませんが、(.MAXを適用する必要があります) –

+0

は掲載のいずれかの解決策は、あなたのために働くましたか? – Divakar

+0

@Divakarありがとう、それは動作します。しかし、値(例ではa == 7)が配列内に存在しない場合は、問題があります。それはどのように解決するのか、最大配列インデックスを返しますか? –

答えて

2

最後のインデックスを取得するには、すべての軸に沿って注文を反転してから、np.argmax()をマッチで使用することができます。反転するというアイデアは、効率的なnp.argmaxを利用して、最初に一致するインデックスを取得することです。

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

def last_match_index(a, value): 
    idx = np.array(np.unravel_index(((a==value)[::-1,::-1,::-1]).argmax(), a.shape)) 
    return a.shape - idx - 1 

ランタイムテスト -

In [180]: a = np.random.randint(0,10,(100,100,100)) 

In [181]: last_match_index(a,7) 
Out[181]: array([99, 99, 89]) 

# @waterboy5281's argwhere soln 
In [182]: np.argwhere(a==7)[-1] 
Out[182]: array([99, 99, 89]) 

In [183]: %timeit np.argwhere(a==7)[-1] 
100 loops, best of 3: 4.67 ms per loop 

In [184]: %timeit last_match_index(a,7) 
1000 loops, best of 3: 861 µs per loop 

あなたは、軸に沿って最後のインデックスを取得axis=0を言うと、2つの軸に沿って繰り返し処理を、してみましょうするために探している場合最後の2つの軸を言うならば、我々は同じ方法論を採用することができます -

a.shape[0] - (a==7)[::-1,:,:].argmax(0) - 1 

S十分な実行 -

In [158]: a = np.random.randint(4,8,(100,100,100)) 
    ...: m,n,r = a.shape 
    ...: out = np.full((n,r),np.nan) 
    ...: for i in range(n): 
    ...:  for j in range(r): 
    ...:   out[i,j] = np.argwhere(a[:,i,j]==7)[-1] 
    ...:   

In [159]: out1 = a.shape[0] - (a==7)[::-1,:,:].argmax(0) - 1 

In [160]: np.allclose(out, out1) 
Out[160]: True 
+0

戻り値1d配列には3つの要素があります。 2d配列では、axia = 0に同じ方法を適用したい。すべてのb [:、i、j]ループiとjと同様。 –

+0

@LiZiming投稿の最後に追加された編集を確認します。 – Divakar

1

まず、7が最後に出現する位置のインデックスを取得するには、次のようにします。今

import numpy as np 
a = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]) 

indices = np.argwhere(a== 7) 
last_index = indices[-1] 
# 10 

あなたは3次元配列を持っていた場合、あなたはまだ7の発生を取得するためにnp.argwhereを使用することができますしかし、それぞれの出現は3次元空間内にある。最後の7の出現を得るには、もう一度書きます。

b = np.tile(a.reshape(17,1,1), reps=(1,30,30)) 
np.argwhere(b==7)[-1] 
# [10 29 29] 

あなたが期待するものを正確に返します。

+0

2次元配列で、axia = 0に同じ方法を適用したいと思います。すべてのb [:、i、j]ループiとjと同様。 –

関連する問題