对多个NumPy数组进行排序
我正在创建一个二维的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 个回答
你可以使用 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
的形状不兼容。)