Найти индексы элемента в 2D массиве - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть фрагмент кода ниже, который вычисляет максимальное значение массива. Затем он вычисляет значение для 90% от максимума, находит самое близкое к нему значение в массиве, а также соответствующий ему индекс.

Мне нужно убедиться, что я нахожу наиболее близкое значение к 90%, которое встречается только до максимума. Может кто-нибудь помочь с этим, пожалуйста? Я думал о том, возможно, сжать массив после достижения максимума, но тогда каждый используемый мной массив будет иметь другой размер, и это будет сложно позже.

import numpy as np

#make amplitude arrays
amplitude=[0,1,2,3, 5.5, 6,5,2,2, 4, 2,3,1,6.5,5,7,1,2,2,3,8,4,9,2,3,4,8,4,9,3]

#split arrays up into a line for each sample
traceno=5                  #number of traces in file
samplesno=6                #number of samples in each trace. This wont change.

amplitude_split=np.array(amplitude, dtype=np.int).reshape((traceno,samplesno))

#find max value of trace
max_amp=np.amax(amplitude_split,1)

#find index of max value
ind_max_amp=np.argmax(amplitude_split, axis=1, out=None)

#find 90% of max value of trace
amp_90=np.amax(amplitude_split,1)*0.9

# find the indices of the min absolute difference 
indices_90 = np.argmin(np.abs(amplitude_split - amp_90[:, None]), axis=1)
print("indices for 90 percent are", + indices_90)

1 Ответ

1 голос
/ 20 апреля 2020

Используйте маску для установки значений после максимума (включая максимум?) На известное «слишком высокое» значение. Затем argmin вернет индекс минимальной разницы в «допустимой» области каждой строки.

# Create a mask for amplitude equal to the maximum  
# add a dimension to max_amp.  
mask = np.equal(amplitude_split, max_amp[-1, None]) 

# Cumsum the mask to set all elements in a row after the first True to True 
mask[:] = mask.cumsum(axis = 1)
mask
# array([[False, False, False, False, False,  True],
#        [ True,  True,  True,  True,  True,  True],
#        [False, False, False,  True,  True,  True],
#        [False, False, False, False,  True,  True],
#        [False, False, False, False,  True,  True]])

# Set inter to the absolute difference.
inter = np.abs(amplitude_split - amp_90[-1,None])

# Set the max and after to a high value (10. here).
inter[mask] = max_amp.max()   # Any suitably high value

inter  # Where the mask is True inter == 9. 
# array([[8.1, 7.1, 6.1, 5.1, 3.1, 9. ],
#        [9. , 9. , 9. , 9. , 9. , 9. ],
#        [7.1, 2.1, 3.1, 9. , 9. , 9. ],
#        [6.1, 5.1, 0.1, 4.1, 9. , 9. ],
#        [5.1, 4.1, 0.1, 4.1, 9. , 9. ]])

# Find the indices of the minimum in each row
np.argmin(inter, axis = 1)
# array([4, 0, 1, 2, 2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...