考虑以下生成以下 dst
矩阵的代码。
tmp = pd.DataFrame()
tmp['a'] = np.random.randint(1, 10, 5)
tmp['b'] = np.random.randint(1, 10, 5)
dst = pairwise_distances(tmp, tmp, metric='l2')
dst
如下所示
数组([[0., 5.38516481, 5., 4.12310563, 2.],
[5.38516481, 0., 1.41421356, 3.16227766, 5.],
[5。 , 1.41421356, 0., 4., 4.12310563],
[4.12310563, 3.16227766, 4., 0., 5.],
[2。 , 5. , 4.12310563, 5. , 0. ]])
现在,我想以某种方式获取 4
作为输出列,因为对于 row=0 和 col=4
来说,是 row0
的最小距离code> 到除自身之外的另一行。
我正在尝试使用以下代码来完成这项工作!但是 np.nonzeros() 搞乱了游戏。
np.argmin(dst[0, np.nonzero(dst[0,:])])
我得到 3
作为输出,我应该得到 4
。我知道 np.nonzero()
返回另一组维度 [1,2,3,4]
,其中 argmin
选择 第三
列是dst
矩阵的实际第四
列。需要帮忙!提前致谢!!
最佳答案
使用 np.min
而不是 argmin
,并将结果与 dst[0,:]
进行比较。最后,将其传递给 np.flatnonzero
或 np.nonzero
np.flatnonzero(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])
Out[150]: array([4], dtype=int64)
或者
np.nonzero(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])[0]
Out[151]: array([4], dtype=int64)
如果你想返回一个整数索引,你可以在最后一步使用np.argmax
np.argmax(np.min(dst[0,np.nonzero(dst[0,:])]) == dst[0,:])
Out[157]: 4
关于python - 我想获取不包括零的行的最小数字索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58479634/