python - 如果最小值满足特定条件,则在函数中编写查找第二最小值的脚本
问题描述
对于我拥有的一组矩阵,称为 distance_matrix (它们存在于一个函数中,然后在给定范围内生成所有这些矩阵)。我需要在这个矩阵中找到最小值,显然是由一个索引对表示的,为此我有这个代码:
min_indices = np.unravel_index(np.argmin(np.abs(distance_matrix)),np.shape(distance_matrix))
这工作得很好。但是现在我需要写一些东西,如果上面代码返回的索引是(0,0),则找到第二低的值。我想我不能使用上面的代码,因为你不能修改它来找到下一个值(据我所知)。我已经尝试过使用 if 循环,但那不是很有效:
sdiff = np.diff(np.sign(np.diff(distance_matrix)))
rising_1 = (sdiff == 2)
rising_2 = (sdiff[:-1] == 1) & (sdiff[1:] == 1)
rising_all = rising_1
rising_all[1:] = rising_all[1:] | rising_2
min_ind = np.where(rising_all)[0] + 1
minima = list(zip(min_ind, distance_matrix[min_ind]))
for ind_pair in range(0,len(minima)):
if ind_pair ==(0,0):
minima=sorted(minima, key=lambda pair: pair[1])[1]
else:
minima=sorted(minima, key=lambda pair: pair[1])[0]
解决方案
假设距离矩阵是二维的,然后使用以下测试数据:
distance_matrix = np.array([[0. , 1. , 2. ],
[1. , 0.5, 1.5],
[2. , 1.5, 2. ]])
现在,
np.unravel_index(
np.argmin(np.abs(distance_matrix)),
np.shape(distance_matrix)
)
为您返回(0, 0)
,这当然是您不想要的。但是,您是否有理由不能通过使用以下内容来实现这一目标:
mask = np.ones(np.shape(distance_matrix))
mask[0, 0] = np.nan # you can put this in a loop if there is
# more than one coordinate set you don't want
distance_matrix * mask
# array([[nan, 1. , 2. ],
# [1. , 0.5, 1.5],
# [2. , 1.5, 2. ]])
np.unravel_index(
np.nanargmin(np.abs(distance_matrix * mask)),
np.shape(distance_matrix)
)
# (1, 1)
请注意,这nanargmin
是一个 argmin
忽略NaN
s 的版本。
推荐阅读
- php - 如何远程更新 Symfony FW 应用程序?
- android - 如何在回收站视图android中放置一个标签,即(新)?
- javascript - 如何在网关脚本中解析文本/纯内容
- javascript - 映射值的最佳数据结构
- tensorflow - 通过采集函数中的精确梯度进行贝叶斯非参数进化 - TensorFlow Core v2.5.0
- javascript - Vimeo Video 当前当前滑块取消静音/自动播放和其他静音/自动播放暂停
- android - 如何替换协程android中的回调
- ruby - Ruby返回虚数
- javascript - 有没有办法使用 Discord.js 回复机器人以激活命令。此外,给用户一定的时间来使用该命令
- python - 在 fastai 中使用协同过滤后,你能得到一个预测的用户项目矩阵吗?