Python 查找二维数组中元素的索引

Python 查找二维数组中元素的索引,python,arrays,numpy,Python,Arrays,Numpy,下面有一段代码可以计算数组的最大值。然后,它计算最大值的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,

下面有一段代码可以计算数组的最大值。然后,它计算最大值的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)

使用遮罩将最大值(包括最大值?)后的值设置为已知的“过高”值。然后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])

为什么不将零件从第一个元素分割到找到的最大位置作为一个新阵列,然后继续使用它来完成90%的任务呢?嗨,谢谢。我能不能把它看一遍,这样我就能明白发生了什么?掩码-确定振幅分割阵列和最大安培阵列中的值是否相等。mask[:}=mask.cumsum(axis=1)-不太确定inter-查找inter[mask]=10的绝对差。这用于将最大值及其后的每个值设置为适当的高值。是否仍要将其设置为最大值?np.argmin(inter,axis=1)-查找差异最小的索引。此外,当我运行此操作时,我得到以下错误:ValueError:操作数无法与形状(5,6)(5,)一起广播很抱歉,我在处理数据时重塑了最大值。我现在重新整合了最大值重塑。
inter
作为第一步被设置为绝对差值。然后使用布尔掩码,掩码为真的那些元素现在被设置为最大值。谢谢!你能告诉我掩码.cumsum(axis=1)是什么吗操作是否可行?
cumsum()
沿轴进行累积求和。[1,2,3,4]->[1,3,6,10]。布尔值True等于1,因此[False,True,False,False]变为[False,True,True,True]。一旦行中的一个元素为True,以下所有元素也将为True。