请考虑以下代码,该代码将生成以下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
列。需要帮忙!在此先感谢!
答案 0 :(得分:1)
使用argmin
代替np.min
,并将结果与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