あなたはrolling windowを使用して、必要な値のためにそれを検索することができます。
import numpy as np
arr = np.array([1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 3L, 3L, 3L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L])
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
match_1_0 = np.all(rolling_window(arr, 2) == [1, 0], axis=1)
match_1_3 = np.all(rolling_window(arr, 2) == [1, 3], axis=1)
all_matches = np.logical_or(match_1_0, match_1_3)
print(np.flatnonzero(all_matches)[-1])
Dependiあなたの配列に、これは十分にパフォーマンスが良いかもしれません。ことで、あまり柔軟性(しかし、単純な)ソリューションは ...より良い、それはあなたが通常がnumpyのを避けたいのインデックスを超えるループであっても実行することがあります:
for ix in xrange(len(arr) - 2, -1, -1): # range in python3.x
if arr[ix] == 1 and (arr[ix + 1] == 0 or arr[ix + 1] == 3):
return ix
あなたもあるかもしれませんどのように、おそらく上記のハードコード化されたソリューションよりも少し柔軟性があり、おそらくまだ出て、実行することになり、ローリングウィンドウ溶液(私が推測する)何かを行うことができる:ここで
def rfind(haystack, needle):
len_needle = len(needle)
for ix in xrange(len(haystack) - len_needle, -1, -1): # range in python3.x
if (haystack[ix:ix + len_needle] == needle).all():
return ix
を、あなたが何かをしたいですlike:
max(rfind(arr, np.array([1, 0])), rfind(arr, np.array([1, 3])))
もちろん、これらすべての回答では、実際にあなたが探しているものが存在しないケースは処理していません