Как отсортировать сложенный массив numpy без других значений go вне порядка - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть следующий код, который содержит несколько массивов numpy, которые я пытаюсь отсортировать в числовом порядке в соответствии с идентификатором:

from astropy.table import Table
import numpy as np
from math import log10

cat_fil = '/home/myname/filtered_catalogue.csv'
cat_fil = Table.read(cat_fil, format="ascii")

ID = np.array(cat_fil['id'])
ID = ID.astype(str)

redshift = np.array(cat_fil['z'])
redshift = redshift.astype(float)

radius = np.array(cat_fil['radius_pixels']) 
radius = radius.astype(float)

mag = np.array(cat_fil['magntiude'])
mag = mag.astype(float)


stacked = np.column_stack((ID, redshift, radius, mag))
stacked = stacked.astype(float)

idx = ((stacked[:, 1] > 0.0) & 
      (stacked[:, 2] > 10.0) &
       (stacked[:, 3] > 0.0)) 

filtered = stacked[idx]
**filtered = np.sort(filtered, axis = 0)**

print(filtered[0])

Проблема, с которой я столкнулся, заключается в сортировке массива. Всякий раз, когда я сортирую идентификатор в порядке возрастания числа, он не перемещает остальные данные вместе с ним, что означает, что при выполнении моего кода он присваивает неправильные значения каждому идентификатору. Есть ли способ сортировки всех массивов numpy с точки зрения увеличения числового идентификатора, при этом также сохраняя фактические строки вместе, так что правильные данные остаются рядом друг с другом.

1 Ответ

0 голосов
/ 26 февраля 2020

Из краткого прочтения вашего вопроса / кода я понял, что у вас есть двумерный массив, который вы хотите отсортировать по первому столбцу. Давайте создадим простой массив, подобный этому:

In [258]: arr = np.random.randint(0,10,(4,3))                                                  
In [259]: arr                                                                                  
Out[259]: 
array([[0, 9, 7],
       [8, 7, 1],
       [3, 7, 8],
       [3, 5, 9]])

Sort, с параметром оси 0, сортирует каждый столбец независимо:

In [260]: np.sort(arr, axis=0)                                                                 
Out[260]: 
array([[0, 5, 1],
       [3, 7, 7],
       [3, 7, 8],
       [8, 9, 9]])

Но с argsort мы получаем индексы для сортировки просто первый столбец:

In [261]: idx = np.argsort(arr[:,0])                                                           
In [262]: idx                                                                                  
Out[262]: array([0, 2, 3, 1])

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

In [263]: arr[idx,:]                                                                           
Out[263]: 
array([[0, 9, 7],
       [3, 7, 8],
       [3, 5, 9],
       [8, 7, 1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...