Первое вхождение значения больше указанного в массиве numpy

У меня есть 2D-массив, как:

r1= np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]])

Мне нужно найти для каждой строки первое вхождение значения, превышающего значение по умолчанию. Я использую это:

default=2
ans= np.argmax(r1>default,1)

Проблема заключается в том, что он работает, если существует значение, превышающее значение по умолчанию, но возвращает ноль, если такое значение не найдено. Таким образом, он возвращает ноль в 2 случаях: 1) первое значение в каждой строке больше значения по умолчанию 2) ни одно значение в каждом случае не превышает значение по умолчанию

#simple case:
In[31]: np.argmax(r1>2,1)
Out[31]: array([2, 1, 0], dtype=int64)

#trouble case- both returning zeros
In[32]: np.argmax(r1>7,1)
Out[32]: array([0, 0, 0], dtype=int64)
In[33]: np.argmax(r1>0.5,1)
Out[33]: array([0, 0, 0], dtype=int64)

Я в настоящее время использую это, чтобы решить это:

In[37]: np.any(r1>7,1) + np.argmax(r1>7,1)-1
Out[37]: array([-1, -1, -1], dtype=int64)
In[38]: np.any(r1>0.5,1) + np.argmax(r1>0.5,1)-1
Out[38]: array([0, 0, 0], dtype=int64)

Любые другие предложения, чтобы упростить это?

2 ответа

Вложенный список (2d массив) формы

l = [[n1,n2,n3],[m1,m2,m3]...]

можно просмотреть первое значение в каждом вложенном списке, превышающем заданное число "d", используя

[[i for i in x if i>d][0] for x in l]

Уже выглядит довольно лаконично, если честно. Но вот альтернатива, я думаю, может сработать:

ans = np.argmax(r1>default,1) - (np.amin(r1<=default,1))

Часть в конце создает массив логических значений, указывающих, когда все элементы в строке ниже или равны вашему значению по умолчанию.

Любое значение False в строке (т.е. любое значение, превышающее значение по умолчанию) делает все это ложным. Только когда все значения ниже значений по умолчанию, мы получим результат True.

Другие вопросы по тегам