为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

心有法竹 2022-05-24 18:14:18
考虑这个二维数组: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])如果这可以在没有for或while循环的情况下完成,那就太好了——由于计算时间限制,我真的不能使用它们。
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您可以将不需要的条目设置为小于数组中最小值的值,然后取行最大值:


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

#        [0, 4, 8, 2],

#        [0, 0, 1, 2],

#        [0, 0, 0, 4]])

np.amax(a, axis=1)

# array([5, 8, 2, 4])


查看完整回答
反对 回复 2022-05-24
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以使用列表理解。


   import numpy as np

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

   inds = [-2,-3,-2,-1] # the indices in your example


   result = [max(line[i:]) for line,i in zip(a,inds)]

   print(result)

   #output

   [5, 8, 2, 4]


查看完整回答
反对 回复 2022-05-24
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您可以在此答案中创建一个掩码:


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  #starting indices

mask=np.arange(a.shape[1]) >= idx[:,None]


# array([[False, False,  True,  True],

#       [False,  True,  True,  True],

#       [False, False,  True,  True],

#       [False, False, False,  True]])

然后使用过掩码数组应用reduceat :maximum


n = np.roll(n,1) #indices for slices

n[0] = 0 #starts at zero


np.maximum.reduceat(a[mask],n.cumsum())

array([5, 8, 2, 4], dtype=int32)


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号