对多个NumPy数组进行排序

2 投票
1 回答
1431 浏览
提问于 2025-04-16 16:22

我正在创建一个二维的numpy数组,里面存储的是股票的收益。我想每两天把收益加起来,如果这个和在前两名,我就会把一个形状相似的数组里的每个元素都设为True。

比如,下面的returns就是四只不同股票的每日收益。

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

在前两天中,第二列和第三列(从0开始算)加起来的和是最高的。对于第二组两天,第一列和第三列的和最高。我想要的输出数组是

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

在前两天中,第二列和第三列的和是并列的第二高。我想通过最后一行在并列列中的最大值来决定胜出者,这样在第二列和第三列的比较中,就会看tiebreaks[1][2]和tiebreaks[1][3](4和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 个回答

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 的形状不兼容。)

撰写回答