迭代2D numpy数组以查找相应的最大值

2024-09-30 22:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组这样的数据:

interactions=np.array([[0,1], [0,2], [0,3], [1,2], [1, 4], [2, 1], [2,5], [2,7]])

我需要迭代第一列中的每个值,在第二列中找到相应的最大值,然后存储在新数组中(或者从该数组中删除其他值)。因此,对于本例,最终输出为:

interactions=[[0, 3], [1, 4], [2,7]]

我已经成功地编写了一段代码,可以对特定的列值执行此操作,但无法解决如何将其转换为循环来执行整个数组:

创建一个数组以在其中存储值:

p_gamma=np.amax(interactions[:,0])
zfinal=np.zeros([np.int(p_gamma)+1, 2])

找到每个列值的最大值(这就是我需要帮助的地方!):

counter=0
interactions=interactions[interactions[:,0] ==counter]
maxval=np.amax(interactions[:, 1])
interactions=interactions[interactions[:, 1] == maxval]
zfinal[0,:]=interactions

提前感谢您提供的任何帮助


Tags: 数据代码npcounterzeros数组arrayint
3条回答

这方面的numpy方法是:

i = np.flatnonzero(np.diff(interactions[:, 0])) + 1   # finding indices where first column changes
np.maximum.reduceat(interactions, np.r_[0, i])        # taking maximum values between those indices

array([[0, 3],
       [1, 4],
       [2, 7]], dtype=int32)

这是一种可能的单行解决方案,无需使用任何其他库:

result = list(zip(np.unique(interactions[:,0]),
                  map(max, np.split(interactions[:,1], 
                                    np.unique(interactions[:,0], 
                                              return_index=True)[1][1:]))))

输出:

[(0, 3), (1, 4), (2, 7)]

使用pandas groupby第一列0并取max并转换回numpy数组:

import pandas as pd
pd.DataFrame(interactions).groupby(0).max().reset_index().to_numpy()

输出:

[[0 3]
 [1 4]
 [2 7]]

说明

  • pd.DataFrame(interactions):从numpy数组创建数据帧
  • groupby(0):按第一列对数据进行分组
  • max():查找每个组中第二列的最大值
  • reset_index():将groupby对象转换为数据帧
  • to_numpy():将数据帧转换为numpy数组

相关问题 更多 >