Сортировка массива 2 на 2 Numpy по одному столбцу в порядке убывания - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь несколько элегантно отсортировать массив 2 на 2 Numpy, чтобы буквы продолжали группироваться с их уважаемыми начальными значениями с плавающей запятой. Но значения с плавающей запятой должны быть отсортированы от наибольшего к наименьшему.

this = {"z": 1.6, "aaaaaaaaaaaaa": 0, "w": 6, "v": 4}
orThis = [['z' '1.6']
 ['aaaaaaaaaaaaa' '0']
 ['w' '6']
 ['v' '4']]

shouldBecomeThis = [['w', 6. ],
                 ['v', 4. ],
                 ['z', 1.6],
                 ['aaaaaaaaaaaaa', 0 ]]

причина, по которой результат должен выглядеть именно так, заключается в том, что я хочу передать его в pandas фрейм данных

import pandas as pd

def plotTable(data, header):        
  fig, ax = plt.subplots()
  fig.patch.set_visible(False)
  ax.axis('off')
  ax.axis('tight')     
  df = pd.DataFrame(data, columns=["gene", header])
  #top line throws error if i feed it data= [('w', 6. ) ('v', 4. ) ('z', 1.6) ('aaaaaaaaaaaaa', 0. )]       
  ax.table(cellText=df.values, colLabels=df.columns, loc='center')            
  fig.tight_layout()                       
  plt.show()

foo = [['w', 6. ],
      ['v', 4. ],
      ['z', 1.6],
      ['aaaaaaaaaaaaa', 0 ]]

plotTable(foo, "SomeTableHeader")
#Plots a table. 
sortData = {"z": 1.6, "aaaaaaaaaaaaa": 0, "w": 6, "v": 4}
npArray = np.array(list(sortData.items()))
sortData = np.array(list(sortData.items()), dt)
sortData.view('<U16,<f8').sort(order=['f1'], axis=0)
sortData = np.flip(sortData, 0)
print(sortData)
#best i got so far: [('w', 6. ) ('v', 4. ) ('z', 1.6) ('aaaaaaaaaaaaa', 0. )]

Я уже просмотрел этот, но он не смог заставить его работать: Сортировка массивов в NumPy по столбцу

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

import numpy as np
this = {"z": 1.6, "aaaaaaaaaaaaa": 0, "w": 6, "v": 4}
array=np.array([[key,val] for (key,val) in this.items()])
sortedArr = array[array[:,1].argsort()[::-1]]
print(sortedArr)
1 голос
/ 03 августа 2020

Я думаю, что простой sorted должен помочь вам получить этот результат -

d = {"z": 1.6, "aaaaaaaaaaaaa": 0, "w": 6, "v": 4}
sorted(d.items(), key=lambda x:x[1], reverse=True)
[('w', 6), ('v', 4), ('z', 1.6), ('aaaaaaaaaaaaa', 0)]

Вы можете применить dict() на выходе, чтобы получить обратно словарь, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...