2016-12-28 3 views
1

Вот сценарий:Как извлечь индекс значения в массив numpy?

У меня есть следующие переменные:

val = [('am', '<f8'), ('fr', '<f8')] # val is type numpy.recarray  

am = [12.33, 1.22, 5.43, 15.23] # am is type numpy.ndarray 

fr = [0.11, 1.23, 2.01, 1.01] # fr is type numpy.ndarray 

Что мне нужно, чтобы обнаружить индекс для ат = 12,33 и я = 15.23, когда извлеченный (в этом случае индексы [ 0] и [3]), мне нужно создать новые переменные:

new_am = [12.33, 15.23] 

new_fr = [0.11, 1.01] 

Мой вопрос: Любая идея о том, как извлечь индексы?

Я уже использовал .index и np.where, но это, кажется, есть проблемы, так как я получил сообщение об ошибке для .index ---> «AttributeError: '' numpy.ndarray объект не имеет атрибута .index "и для np.where возвращение индекса ничего ---> "массив ([], DTYPE = int64)"

Спасибо за любую идею!

+0

Итак, вы хотите, чтобы индекс был «np.array ([0, 3]) здесь? 'np.where (am == 12.33) [0]' не дает вам то, что вам нужно? – Psidom

+0

Правильно, и с этим ... создайте «new_am» и «new_fr», представленные выше. – FMEZA

+0

no ... 'np.where (am == 12.33) [0]' вернуть пустой массив – FMEZA

ответ

1

Вы можете в np.in1d, который возвращает массив булево, чтобы указать, если элемент находится в другом массиве:

import numpy as np 
am = np.array([12.33, 1.22, 5.43, 15.23]) 
fr = np.array([0.11, 1.23, 2.01, 1.01]) 

index = np.where(np.in1d(am, [12.33, 15.23]))[0] 
index 
# array([0, 3]) 

am[index] 
# array([ 12.33, 15.23]) 

fr[index] 
# array([ 0.11, 1.01]) 

Или, может быть, у вас есть массив с атрибутами:

new_arr = np.array(zip(am, fr), dtype=val) 

index = np.where(np.in1d(new_arr['am'], [12.33, 15.23]))[0] 

new_am = new_arr[index]['am'] 
new_fr = new_arr[index]['fr'] 

new_am 
# array([ 12.33, 15.23]) 

new_fr 
# array([ 0.11, 1.01]) 
+0

Спасибо! интересно .... кажется, работает для значений, которые я дал вам, но не для моих реальных значений аргументов ... все они имеют точно такие же функции значений из приведенного выше примера: '>> params ['ampl'] ---> array ([3931.41287385, 412.51629703, 257.47891338, ..., 193.89134605, 192.66807322, 192.20132863]) ---> index = np.where (np.in1d ​​(params ['ampl'], [3931.41287385])) [0] ---> index ---> array ([], dtype = int64) ' – FMEZA

+0

Это может быть из-за неточности номера поплавка. Вы можете проверить это на 'params ['ampl'] [0] == 3931.41287385', чтобы казаться, если они равны. Здесь необходимо ввести определенную толерантность. – Psidom

+0

Спасибо ... к сожалению, такое же поведение 'index = np.where (params ['ampl'] [0] == 3931.41287385) ---> index ---> (array ([], dtype = int64),)' – FMEZA

Смежные вопросы