在多个NumPy阵列上排序

时间:2011-04-25 15:06:14

标签: 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 个答案:

答案 0 :(得分: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没有兼容的形状。)