我正在创建一个包含股票回报的二维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]])
感谢您的帮助。
答案 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])
(请注意,在您的示例中,names
和prices
没有兼容的形状。)