2011-04-25 105 views
2

我正在創建一個包含股票收益的2維numpy數組。我想每2天總結一次回報,如果總和位於前兩位,我會將類似陣列中的每個元素設置爲True。在多個NumPy數組上排序

例如,下面的回報是四種不同股票的每日回報。

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

對於前兩天,列2和3(使用0基於索引)具有最高的總和。對於第二天的兩天,第0列和第2列的總和最高。輸出數組我想要的是

有什麼好辦法做到這一點?

如果與兩天的總和有關係,我想使用另一個類似形狀的numpy數組作爲tiebreakers。

例如,如果

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

對於第一組的兩個天,列2和3並列第二最高總和。我想根據最後一列中的最大值決定tie tieer,以便第2和第3列之間的平局突破可以查看tiebreaks [1] [2] vs tiebreaks [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]])

感謝您的幫助。

+0

在你的榜樣,事情已經出現,根據您的分類條件和'names'數組有明顯不必要的維度。如果你能提供一個更現實的例子和期望結果的例子,這將是有幫助的。 – Paul 2011-04-25 15:14:38

+0

你的編輯已經使這個完全不同的問題。請回滾編輯並改爲提出新問題。 – 2011-04-26 12:25:39

回答

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]) 

(注意,在你的榜樣,namesprices沒有兼容形狀)