Сортировать части двумерного массива - PullRequest
0 голосов
/ 13 января 2019

Итак, у меня есть массив A размеров (8760,12). В основном все часы 12 лет. Мне нужно сортировать каждый месяц (730 часов) в каждом году в массиве. Я не нашел способа сделать это внутри массива. Поэтому мое решение заключалось в том, чтобы убирать каждый месяц, сортировать его, а затем снова создавать весь 2d-массив. Я думал о том, чтобы сделать что-то в соответствии с тем, что у меня ниже, но это не работает.

total=np.zeroes([8760,12])
for j in range(1,12):
    for i in range (1,12):
        #here i take out every month of every year
        month=A[730*(i-1):-730*(12-i),(j-1):-(12-j)]
        #here I sort the data
        month_sorted=np.sort(month,axis=0,kind='quicksort')
        #here I try to add the sorted months back into 1 big array
        np.concatenate(total,month_sorted,axis=0)
    np.concatenate(total,month_sorted,axis=1)

Конкатенация не работает с массивами разных размеров.

И у меня нет способа поместить месяц 2 в строку 2 моего массива. Я думаю, это должно быть сделано с индексированием idx или iloc или что-то в этом роде.

EDIT: Мои значения целые.

Результатом должны быть значения, упорядоченные от низкого до высокого для каждых 730 (часов в месяц) значений в строке. Итак, представьте, что у меня будет 3 года вместо 12 и 9 часов вместо 8760 часов, которые нужно сортировать каждые 3 часа вместо каждых 730 часов. Массив выглядит так:

[[30,40,10,20,50,60,80,200,100]
[8,20,5,6,8,1,5,3,2]
[520,840,600,525,430,20,1,506,703]]

И должен быть преобразован в:

[[10,30,40,20,50,60,80,100,200]
[5,8,20,1,6,8,2,3,5]
[520,600,840,20,430,525,1,506,703]]

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

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете полностью избежать зацикливания.

Сначала транспонируйте и изменяйте форму массива так, чтобы индексы массива переходили от грубого к точному (год-> месяц-> час).

A = np.transpose(A)
A = np.reshape(A, [12, 12, 730])

Теперь вы можете выбрать все часы месяца как A[year, month]

Удобно, что функция np.sort по умолчанию сортирует по последней оси массива, так что вы можете просто вызвать

A = np.sort(A)

и теперь каждый список A[year, month] записей будет отсортирован.

0 голосов
/ 13 января 2019

Вы можете использовать Python-индексы и присваивания вместо конкатенации, если сначала создаете пустой массив.

A = np.random.randint(0,99,(8760,12))
total=np.zeros([8760,12])
for j in range(12):
    for i in range (12):
        total[730*i:730*(i+1),j] = np.sort(A[730*i:730*(i+1),j])

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

total2=None
for j in range(12):
    app1 = None
    for i in range (12):
        app = np.sort(A[730*i:730*(i+1),j])
        if app1 is None:
            app1 = app
        else:
            app1 = np.hstack((app1,app))
    if total2 is None:
        total2 = app1
    else:
        total2 = np.vstack((total2,app1))
total2 = np.transpose(total2)

РЕДАКТИРОВАТЬ, чтобы ответить на комментарий (как применить одну и ту же сортировку к другому массиву)

bs = 3
B2 = np.empty(B.shape)
for j in range(A.shape[1]):
    for i in range(int(A.shape[0]/bs)):
        A2_order = np.argsort(A[bs * i : bs * (i + 1), j])
        B2[bs * i : bs * (i + 1),j] = B[A2_order+i*bs,j]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...