Python获取矩阵每行中的第二大元素

时间:2017-03-22 17:14:50

标签: arrays algorithm python-2.7 matrix multidimensional-array

我从相关矩阵开始,这意味着第i个第i个条目将是第i个元素和第j个元素之间的相关性(因此对角线将为1)。我试图找到每个元素与另一个元素的最大相关性(不包括它本身,因为1的列表在我的情况下是没有帮助的)。

1    0.7  0.4  0.1
0.7  1    0.3  0.2
0.4  0.3  1    0.5
0.1  0.2  0.5  1

假设我有上述矩阵。我希望有类似的东西  (最大相关,第i个元素,第j个元素)。在上面的矩阵中,我想得到 [(0.7, 0, 1), (0.7, 1, 0), (0.5, 2, 3), (0.5, 3, 2)]
结果是。

有什么好办法可以解决这个问题? 我有矩阵作为熊猫数据帧。索引和列具有相同的名称,现在说[0, 1, 2, 3]。目前我只想做类似

的事情
D = {}
for i in df.columns:
    max = (0, 0, 0)
    for j in df.columns:
        if i==j:
           continue
        element = df.loc[i,j]
        if element > max[0]:
           max = (element, i, j)
    D[i] = max

这可以做得更好/更快,是否有内置的方法可以改善这一点?

3 个答案:

答案 0 :(得分:1)

试试这个:

import numpy as np

c = np.array([[1. ,  0.7,  0.4,  0.1],
              [0.7,  1. ,  0.3,  0.2],
              [0.4,  0.3,  1. ,  0.5],
              [0.1,  0.2,  0.5,  1. ]])
c -= np.eye(c.shape[0])  # remove the 1 on diagonal
result = np.array([[np.max(row), num_row, np.argmax(row)] for num_row, row in enumerate(c)])

根据我对相关性的理解,我假设你在对称实值二次相关矩阵1的对角线上总是有c的值,并且你不要关心这个对角线条目,所以我只是取消它。我接下来要做的是迭代列表推导中的相关矩阵的所有行。对于每一行,我分别找到np.maxnp.argmax的最大值和最大索引,从而得到您想要的结果。如果您不想使用数组,则可以使用result = [(np.max(row), num_row, np.argmax(row)) for num_row, row in enumerate(c)](或根据@kraskevich result = list(zip(np.max(c, axis=1), np.arange(c.shape[0]), np.argmax(c, axis=1)))的解决方案),它可以准确地生成您的预期输出。

答案 1 :(得分:1)

Firstly, you can fill the diagonal with a value that is smaller than any correlation coefficient. There's a standard numpy function to do it:

np.fill_diagonal(df.values, -2.)

After that you just need to find the maximum value and its index in each column (a DataFrame has methods for computing both) and zip the results:

list(zip(df.max(), df.columns, df.idxmax()))

答案 2 :(得分:0)

所以我结束了使用一些想法,将对角线改为一些相对较小的值,如-1,两个答案(来自Michael和kraskevich),但使用不同的方法。

maxCors = dfFinalCor.apply(lambda x: (max(x), x.idxmax(), x.name)).tolist()

给我我需要的东西:)
另外,我觉得apply在这里运作良好。 (我不知道为什么,但我不想使用zip,除非我必须这样做)