【问题标题】:Sort values of matrix in python在python中对矩阵的值进行排序
【发布时间】:2014-02-21 00:37:18
【问题描述】:

到目前为止我所拥有的是:

dict={'A':[1,2,3], 'B':[2,5,4], 'C':[2,1,8]}
N=len(keys)
m=numpy.zeros(N,N)
for i in range(N):
    for j in range(N):
         m[i-1,j-1]=covariance(values[i-1],values[j-1])
         m[j-1,i-1]=covariance(values[j-1],values[i-1])
m=numpy.triu(m)

这给了我:

1   0.639  0.07
0     1    0.51
0     0      1

我还没有列名或行名。我想要这样的东西:

       A     B      C
A      1   0.639  0.07
B      0     1    0.51
C      0     0      1

给定这个矩阵,我想按矩阵的值降序排序,所以我想要的输出是:

A & A: 1
B & B: 1
C & C: 1
A & B: 0.639
B & C: 0.51
A & C: 0.07
B & A: 0 #etc

想从输出中将其保存到一个csv文件中,其中第一列是名称,第二列是相应的分数

感谢阅读。

【问题讨论】:

  • 您需要在提问之前展示您所做的事情。如果您不知道从哪里开始,这里有一个提示:将数据读入以 'A & A' 等为键的字典,然后使用 sorted() 函数使用 key 参数对字典进行排序。
  • 编辑了我到目前为止的内容

标签: python dictionary numpy matrix


【解决方案1】:

调用np.sort 并将axis 关键字参数设置为None,然后使用切片反转它:

>>> a = np.array([[1, 0.639, 0.07], [0, 1, 0.51], [0, 0, 1]])
>>> a
array([[ 1.   ,  0.639,  0.07 ],
       [ 0.   ,  1.   ,  0.51 ],
       [ 0.   ,  0.   ,  1.   ]])
>>> np.sort(a, axis=None)[::-1]
array([ 1.   ,  1.   ,  1.   ,  0.639,  0.51 ,  0.07 ,  0.   ,  0.   ,  0.   ])

如果您想知道每个值的来源,请先使用np.argsort,然后解开扁平索引:

>>> idx = np.argsort(a, axis=None)[::-1]
>>> rows, cols = np.unravel_index(idx, a.shape)
>>> a_sorted = a[rows, cols]
>>> for r, c, v in zip(rows, cols, a_sorted):
...     print 'ABC'[r], '&', 'ABC'[c], ':', v
... 
C & C : 1.0
B & B : 1.0
A & A : 1.0
A & B : 0.639
B & C : 0.51
A & C : 0.07
C & B : 0.0
C & A : 0.0
B & A : 0.0

【讨论】:

  • 太棒了。我将如何提取 0.51 对应于“B&C”的事实?
  • 他想要他提供的输出。 :)
【解决方案2】:

从一个 numpy 数组开始,像这样:

matrix = numpy.array( [ [ 1, 0.639, 0.07 ],
                        [ 0, 1,     0.51 ],
                        [ 0, 0,     1 ]  ] )

你可以这样做:

indices = ["A", "B", "C", ]                     

values = []

for r,row in enumerate( matrix ):
    for c, cell in enumerate( row ):
        values.append( ("{} & {}".format( indices[r], indices[c] ), cell ) )

values.sort( key=lambda it: (-it[1], it[0]) )

for k,v in values:
    print "{}: {}".format(k,v)

输出:

A & A: 1.0
B & B: 1.0
C & C: 1.0
A & B: 0.639
B & C: 0.51
A & C: 0.07
B & A: 0.0
C & A: 0.0
C & B: 0.0

【讨论】:

  • 收到错误:对于 k,v in values: ValueError:too many values to unpack
  • 我将如何获取输出并将其保存到 csv 文件中
  • @user3334418 csv module docsthe code
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2015-10-12
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多