2011-04-25 38 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没有兼容形状)