我想获取不包含零的行的最小数字索引

时间:2019-10-21 04:02:11

标签: python pandas numpy scikit-learn

请考虑以下代码,该代码将生成以下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

如下所示

array([[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 and col=4而言,row0到与它本身分开的另一行的最小距离。 我正在尝试使用以下代码来完成这项工作!但是np.nonzeros()搞砸了游戏。 np.argmin(dst[0, np.nonzero(dst[0,:])])我得到3作为输出,我应该得到4。我知道np.nonzero()返回另一组维度[1,2,3,4],其中argmin选择3rd列,该列是4th矩阵的实际dst列。需要帮忙!在此先感谢!

1 个答案:

答案 0 :(得分:1)

使用argmin代替np.min,并将结果与​​dst[0,:]进行比较。最后,将其传递给np.flatnonzeronp.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