1

np.array を見てみましょう:

array = np.array([[1, 4], 
                 [0, 3], 
                 [2, 3]])

このコードを使用して、値がしきい値より大きい最初の列の最初の要素を見つけます。

index = np.argmax(array[:, 0] > threshold)

しきい値 = 1 を取得すると、期待どおりのインデックスが得られます。

>>index = 2

しかし、2 より大きい値を選択すると、出力は 0 になります。どの要素もしきい値を満たさない場合に備えて、最初の値ではなく最後の値を取得したいため、これは私のプログラムを台無しにします。

その場合、配列の最後の値を取得する効率的な方法はありますか?

編集:

ここでこれがどのように役立つか実際にはわかりません: Numpy: How to find first non-zero value in every column of a numpy array?

むしろ、0 ではなく argmax を返すようなものを探していFalseます。

@Divakar と @Achintha Ihalage によるソリューションの比較

import numpy as np
import time

def first_nonzero(arr, axis, invalid_val=-1):
    mask = arr != 0
    return np.where(mask.any(axis=axis), mask.argmax(axis=axis), invalid_val)


array = np.random.rand(50000, 50000) * 10
test = array[:, 0]
threshold = 11

t1 = time.time()
index1 = np.argmax(array[:, 0] > threshold) if any(array[:, 0] > threshold) else len(array[:, 0])-1
elapsed1 = time.time() - t1

t2 = time.time()
index2 = first_nonzero(array[:, 0] > threshold, axis=0, invalid_val=len(array[:, 0])-1)
elapsed2 = time.time() - t2

print(index1, "time: ", elapsed1)
print(index2, "time: ", elapsed2)
>>49999 time:  0.012960195541381836
>>49999 time:  0.0009734630584716797

したがって、@Divakarのソリューションは超高速です! どうもありがとう!

4

2 に答える 2

1

次のワンライナーを試してください。argmax条件が要素の少なくとも 1 つによって満たされる場合、インデックスを取得します。それ以外の場合は、最後のインデックスを取ります。

index = np.argmax(array[:,0]>threshold) if any(array[:,0]>threshold) else  len(array[:,0])-1
于 2019-08-22T10:19:33.690 に答える