Как извлечь данные только из одного столбца в массиве numpy на основе определенного значения из отсортированного значения столбцов

#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. ])