Как найти строки, имеющие значения от -1 до 1 в заданном двумерном массиве? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть np.array формы (15,3).

final_vals = array([[  37,  -84, -143],
       [  29,    2,   -2],
       [ -18,   -2,    0],
       [  -3,    6,    0],
       [ 361,   -5,    2],
       [ -23,    4,    8],
       [   0,   -1,    0],
       [  -1,    1,    0],
       [  62,  181,   83],
       [-193,  -14,   -2],
       [  42, -154,  -92],
       [  16,  -13,    1],
       [ -10,   -3,    0],
       [-299,  244,  110],
       [ 223, -237, -110]])

. Я пытаюсь найти строки, значения элементов которых находятся в диапазоне от -1 до 1. В массиве, напечатанном выше ROW-6 и ROW-7 - строки назначения / результата.

Я пытался,

result_idx = np.where(np.logical_and(final_vals>=-1, final_vals<=1))

, что возвращает,

result_idx = (array([ 2,  3,  6,  6,  6,  7,  7,  7, 11, 12], dtype=int64),
              array([2, 2, 0, 1, 2, 0, 1, 2, 2, 2], dtype=int64))

Я хочу, чтобы моя программа возвратилатолько номера строк

Ответы [ 6 ]

0 голосов
/ 07 февраля 2019

Простое понимание списка:

[ i for i, row in enumerate(final_vals) if all([ e >= -1 and e <= 1 for e in row ]) ]
#=> [6, 7]
0 голосов
/ 06 февраля 2019

Другой способ - использование pandas. Вы можете получить строку с помощью следующего кода:


df = pd.DataFrame(final_vals)
temp= ((df>=-1) & (df<=1 )).product(axis=1)
rows = temp[temp!=0].keys()
rows

Сначала он проверяет числа от -1 до +1, а затем проверяет строки (с осью =1) что все значения принимают условие.

и результат: Int64Index([ 6, 7], dtype='int64')

0 голосов
/ 06 февраля 2019

Как насчет

np.where(np.all((-1<=final_vals) & (final_vals<=1),axis=1))
0 голосов
/ 06 февраля 2019

Другой способ сделать это на основе вашего подхода - найти значение истинности каждого элемента, а затем использовать numpy.all для каждой строки.Тогда numpy.where получает то, что вы хотите.

mask = (final_vals <= 1) * (final_vals >= -1)
np.where(np.all(mask, axis=1))
0 голосов
/ 06 февраля 2019

Вы можете использовать np.argwhere :

r = np.logical_and(final_vals <= 1, final_vals >=-1)
result = np.argwhere(r.all(1)).flatten()

print(result)

Выход

[6 7]
0 голосов
/ 06 февраля 2019

Вы можете взять абсолютное значение всех элементов и проверить, какие элементы строк меньше или равны 1.Затем используйте np.flatnonzero, чтобы найти индексы, в которых все столбцы соответствуют условию:

np.flatnonzero((np.abs(final_vals) <= 1).all(axis=1))

Выходные данные

array([6, 7], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...