Numpy -- 某个索引后二维数组每一行的最大值

考虑这个二维数组:

import numpy as np
a = np.array([[3,1,5,3],[1,4,8,2],[4,2,1,2],[9,2,4,4]])

我知道如何找到每行的最大条目:np.amax(a, axis=1). 这返回array([5,8,4,9])

然而,我想做的是在某个索引之后获得每行的最大条目n,即忽略第一n项,只为每一行寻找该行中剩余条目中的最大值。

一个并发症:我“切片”每一行的点对于每一行都是不同的。

示例:我想计算每行的最大值,但只计算第一行的最后 2 个条目、第二行的最后 3 个条目、第三行的最后 2 个条目和第四行的最后一个 1 个条目。这应该返回array([5,8,2,4])

如果这可以在没有forwhile循环的情况下完成,那就太好了——由于计算时间限制,我真的不能使用它们。


心有法竹
浏览 247回答 3
3回答

牧羊人nacy

您可以将不需要的条目设置为小于数组中最小值的值,然后取行最大值:starts = np.array([2, 1, 2, 3])mask = np.arange(a.shape[1]) < starts[:, None]a[mask] = np.min(a) - 1# array([[0, 0, 5, 3],#&nbsp; &nbsp; &nbsp; &nbsp; [0, 4, 8, 2],#&nbsp; &nbsp; &nbsp; &nbsp; [0, 0, 1, 2],#&nbsp; &nbsp; &nbsp; &nbsp; [0, 0, 0, 4]])np.amax(a, axis=1)# array([5, 8, 2, 4])

白衣非少年

您可以使用列表理解。&nbsp; &nbsp;import numpy as np&nbsp; &nbsp;a = np.array([[3,1,5,3],[1,4,8,2],[4,2,1,2],[9,2,4,4]])&nbsp; &nbsp;inds = [-2,-3,-2,-1] # the indices in your example&nbsp; &nbsp;result = [max(line[i:]) for line,i in zip(a,inds)]&nbsp; &nbsp;print(result)&nbsp; &nbsp;#output&nbsp; &nbsp;[5, 8, 2, 4]

Cats萌萌

您可以在此答案中创建一个掩码:a = np.array([[3,1,5,3],[1,4,8,2],[4,2,1,2],[9,2,4,4]])n = np.array([2,3,2,1])idx = a.shape[1]-n&nbsp; #starting indicesmask=np.arange(a.shape[1]) >= idx[:,None]# array([[False, False,&nbsp; True,&nbsp; True],#&nbsp; &nbsp; &nbsp; &nbsp;[False,&nbsp; True,&nbsp; True,&nbsp; True],#&nbsp; &nbsp; &nbsp; &nbsp;[False, False,&nbsp; True,&nbsp; True],#&nbsp; &nbsp; &nbsp; &nbsp;[False, False, False,&nbsp; True]])然后使用过掩码数组应用reduceat :maximumn = np.roll(n,1) #indices for slicesn[0] = 0 #starts at zeronp.maximum.reduceat(a[mask],n.cumsum())array([5, 8, 2, 4], dtype=int32)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python