#python #python-3.x #numpy
#python #python-3.x #numpy
Вопрос:
Я сортирую массив, состоящий из двух столбцов в порядке возрастания, а затем на основе значения, большего, чем x в первом столбце, пытаясь извлечь данные для значений> x из 2-го столбца в другой переменной.
Возможность сортировать и находить значения, превышающие x в столбце 1, но не возможность извлекать соответствующие значения из столбца для значений > x .
a1 = np.array([130,4,8,0,87,45,24,22])
a2 = np.array([1.5615, 0.4601, 0.4374, 0.0000, 3.9871, -2.3144, -0.3456, 1.5684])
ind = np.lexsort((a2,a1))
[(a1[i],a2[i]) for i in ind]
r = np.array([a1[ind],a2[ind]])
r1 = sorted(x for x in r[0] if x >= 35)
print(r1)
ожидайте a3 = [-2.3144 3.9871 1.5615] для значений в a2 на основе x> 35 в a1 [45, 87,130]
Ответ №1:
Вместо доступа к значениям в r[0]
вы можете вместо этого сделать что-то вроде этого:
>>> sorted([a2[ind] for ind in range(len(a1)) if a1[ind] > 35], key=lambda
value: np.where(r[1] == value))
[-2.3144, 3.9871, 1.5615]
Это проверит значения в индексах, а затем отсортирует по тому, где находится индекс r[1]
Комментарии:
1. Также показано, что вместо выполнения сортировки по лексике это тоже можно решить таким образом, используя вашу предыдущую ссылку
>>> sorted([a2[ind] for ind in range(len(a1)) if a1[ind] > 35], key=lambda value: np.where(a2 == value))
2. @user3412649 вы можете заменить его на
np.nan_to_num(sorted([a2[ind] if a1[ind] > 35 else np.nan for ind in range(len(a1))], key=lambda value: np.where(r[1] == value)))
This вернет либоa2[ind]
, либоnp.nan
, если оно не существует. Затем мы можем использоватьnp.nan_to_num
для преобразованияnp.nan
значений в0
. Выводитarray([ 1.5615, 0. , 0. , 0. , -2.3144, 3.9871, 0. , 0. ])