获取最小值的索引 Numpy Python
Getting the index of the min values Numpy Python
下面的函数将每个值分成由索引 index
和 L_list
中的值分隔的块。所以它输出索引 3-5
之间的最小值,即 -5 和值的索引。 numpy_argmin_reduceat(a, b)
和 Drawdown
函数都按计划运行,但是 numpy_argmin_reduceat(a, b)
的索引输出是错误的 Drawdown
的最小值与输出的索引不匹配numpy_argmin_reduceat(a, b)
。我该如何解决这个问题?
数组:
import numpy as np
# indexes 0, 1, 2,3,4, 5, 6,7, 8, 9,10, 11, 12
L_list = np.array([10,20,30,0,0,-5,11,2,33, 4, 5, 68, 7])
index = np.array([3,5,7,11])
函数:
#getting the minimum values
Drawdown = np.minimum.reduceat(L_list,index+1)
#Getting the min Index
def numpy_argmin_reduceat(a, b):
n = a.max() + 1 # limit-offset
id_arr = np.zeros(a.size,dtype=int)
id_arr[b] = 1
shift = n*id_arr.cumsum()
sortidx = (a+shift).argsort()
grp_shifted_argmin = b
idx =sortidx[grp_shifted_argmin] - b
min_idx = idx +index
return min_idx
min_idx =numpy_argmin_reduceat(L_list,index+1)
#printing function
DR_val_index = np.array([np.around(Drawdown,1), min_idx])
DR_result = np.apply_along_axis(lambda x: print(f'Min Values: {x[0]} at index: {x[1]}'), 0, DR_val_index)
输出
Min Values: -5 at index: 4
Min Values: 2 at index: 6
Min Values: 4 at index: 8
Min Values: 7 at index: 11
预期输出:
Min Values: -5 at index: 5
Min Values: 2 at index: 7
Min Values: 4 at index: 9
Min Values: 7 at index: 12
使用 np.r_
重新定义索引,然后对索引进行切片和压缩以创建定义块的开始和结束索引的间隔,然后迭代这些间隔和 select [= 中的块13=]对应区间,然后用argmin
找到最小值的索引,将其加到chunk的起始索引上,得到L_list
中的实际索引
i = np.r_[index[0]-1, index[1:], len(L_list)-1] + 1
for x, y in zip(i[:-1], i[1:]):
i_min = x + L_list[x:y].argmin()
print('Min Value:', L_list[i_min], 'at index:', i_min)
Min Value: -5 at index: 5
Min Value: 2 at index: 7
Min Value: 4 at index: 9
Min Value: 7 at index: 12
下面的函数将每个值分成由索引 index
和 L_list
中的值分隔的块。所以它输出索引 3-5
之间的最小值,即 -5 和值的索引。 numpy_argmin_reduceat(a, b)
和 Drawdown
函数都按计划运行,但是 numpy_argmin_reduceat(a, b)
的索引输出是错误的 Drawdown
的最小值与输出的索引不匹配numpy_argmin_reduceat(a, b)
。我该如何解决这个问题?
数组:
import numpy as np
# indexes 0, 1, 2,3,4, 5, 6,7, 8, 9,10, 11, 12
L_list = np.array([10,20,30,0,0,-5,11,2,33, 4, 5, 68, 7])
index = np.array([3,5,7,11])
函数:
#getting the minimum values
Drawdown = np.minimum.reduceat(L_list,index+1)
#Getting the min Index
def numpy_argmin_reduceat(a, b):
n = a.max() + 1 # limit-offset
id_arr = np.zeros(a.size,dtype=int)
id_arr[b] = 1
shift = n*id_arr.cumsum()
sortidx = (a+shift).argsort()
grp_shifted_argmin = b
idx =sortidx[grp_shifted_argmin] - b
min_idx = idx +index
return min_idx
min_idx =numpy_argmin_reduceat(L_list,index+1)
#printing function
DR_val_index = np.array([np.around(Drawdown,1), min_idx])
DR_result = np.apply_along_axis(lambda x: print(f'Min Values: {x[0]} at index: {x[1]}'), 0, DR_val_index)
输出
Min Values: -5 at index: 4
Min Values: 2 at index: 6
Min Values: 4 at index: 8
Min Values: 7 at index: 11
预期输出:
Min Values: -5 at index: 5
Min Values: 2 at index: 7
Min Values: 4 at index: 9
Min Values: 7 at index: 12
使用 np.r_
重新定义索引,然后对索引进行切片和压缩以创建定义块的开始和结束索引的间隔,然后迭代这些间隔和 select [= 中的块13=]对应区间,然后用argmin
找到最小值的索引,将其加到chunk的起始索引上,得到L_list
i = np.r_[index[0]-1, index[1:], len(L_list)-1] + 1
for x, y in zip(i[:-1], i[1:]):
i_min = x + L_list[x:y].argmin()
print('Min Value:', L_list[i_min], 'at index:', i_min)
Min Value: -5 at index: 5
Min Value: 2 at index: 7
Min Value: 4 at index: 9
Min Value: 7 at index: 12