【发布时间】:2018-03-22 17:01:46
【问题描述】:
我有以下方形 DataFrame:
In [104]: d
Out[104]:
a b c d e
a inf 5.909091 8.636364 7.272727 4.454545
b 7.222222 inf 8.666667 7.666667 1.777778
c 15.833333 13.000000 inf 9.166667 14.666667
d 4.444444 3.833333 3.055556 inf 4.833333
e 24.500000 8.000000 44.000000 43.500000 inf
这是修改后的距离矩阵,表示对象 ['a','b','c','d','e'] 之间的成对距离,其中每一行除以一个系数(权重)并且所有对角线元素人为设置为np.inf。
如何以高效(矢量化)方式获得如下索引列表/向量:
d # index of minimal element in the column `a`
a # index of minimal element in the column `b` (excluding already found indices: [d])
b # index of minimal element in the column `c` (excluding already found indices: [d,a])
c # index of minimal element in the column `d` (excluding already found indices: [d,a,b])
即在第一列中我们找到了索引d,所以当我们在第二列中搜索最小值时,我们排除了索引为d(之前在第一列中找到)的行——这将是a。
当我们在第三列中寻找最小值时,我们会排除具有先前找到的索引的行 (['d','a']) - 这将是 b。
当我们在第四列中寻找最小值时,我们会排除具有先前找到的索引的行 (['d','a','b']) - 这将是 c。
我不需要对角线 (inf) 元素,因此生成的列表/向量将包含 d.shape[0] - 1 元素。
即结果列表将如下所示:['d','a','b','c'] 或在 Numpy 解决方案的情况下,相应的数字索引:[3,0,1,2]
使用慢速for loop 解决方案不是问题,但我无法围绕矢量化(快速)解决方案...
【问题讨论】:
-
你能解释一下
excluding already found indices:的意思吗? -
预期输出的第三行有错字,我想应该是
b(下一行实际上显示b作为已找到的索引)。我假设列e的最小元素没有显示/需要,因为它可以通过排除来确定?无论如何,我不确定 can 是否是矢量化解决方案,与上一列的结果存在硬依赖... -
@jdehesa,是的,坦克很多!我现在已经更正了...
-
@cᴏʟᴅsᴘᴇᴇᴅ,我已经用简短的解释更新了我的问题...
-
根据您更新的解决方案,我是这样理解的:“当前步骤的结果取决于上一步的结果”。我想不出没有循环的方法:(