Сортировка по нескольким массивам NumPy

#python #numpy

#python #numpy

Вопрос:

Я создаю двумерный массив numpy, который содержит возвраты акций. Я хочу суммировать возвращаемые данные каждые 2 дня, и если сумма находится в двух верхних, я присвою каждому элементу в массиве аналогичной формы значение True.

Например, ниже приведены ежедневные возвраты для четырех разных акций.


returns=np.array([
[0, 0, 4, 8],
[7, 5, 4, 1],
[10, 5, 7, 6],
[7, 5, 4, 2]])

В течение первых двух дней столбцы 2 и 3 (с использованием индексации на основе 0) имеют наибольшие суммы. Во втором наборе из двух дней столбцы 0 и 2 содержат наибольшие суммы. Выходной массив, который я хочу, это


bools=np.array([
[False, False, True, True],
[False, False, True, True],
[True, False, True, False],
[True, False, True, False]])

Какие есть хорошие способы добиться этого?

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

Например, если


returns=np.array([
[0, 9, 4, 8],
[7, 5, 4, 0],
[10, 5, 7, 6],
[7, 5, 4, 2]])

В течение первых двух дней столбцы 2 и 3 привязаны ко второй по величине сумме. Я хочу определить тай-брейк по наибольшему значению в последней строке для связанных столбцов, чтобы разрыв связи между столбцами 2 и 3 выглядел как тай-брейки [1] [2] против тай-брейков [1][3] (4 v 5), и чтобы конечным результатом был bools2.


tiebreaks=np.array([
[0, 0, 1, 1],
[2, 3, 4, 5],
[0, 5, 7, 6],
[-7, 5, -4, 2]])


bools2=np.array([
[False, True, False, True],
[False, True, False, True],
[True, False, True, False],
[True, False, True, False]])

Спасибо за вашу помощь.

Комментарии:

1. В вашем примере объекты выглядят уже отсортированными в соответствии с вашими критериями, и names массив имеет явно ненужное измерение. Было бы полезно, если бы вы могли привести более реалистичный пример и пример желаемого результата.

2. Ваша правка сделала это совершенно другим вопросом. Пожалуйста, откатите правку и вместо этого задайте новый вопрос.

Ответ №1:

Вы можете использовать numpy.lexsort() для получения индексов, которые сортируют ваши массивы, используя prices в качестве первичного ключа и names в качестве вторичного ключа. Применение расширенной индексации с использованием этих индексов приводит к отсортированным массивам:

 col_indices = numpy.lexsort((names, prices))
row_indices = numpy.arange(len(names))[:, None]
print(prices[row_indices, col_indices])
print(names[row_indices, col_indices])
  

(Обратите внимание, что в вашем примере names и prices не имеют совместимых форм.)