Python 迭代2D numpy数组以查找相应的最大值
我有一组这样的数据:Python 迭代2D numpy数组以查找相应的最大值,python,arrays,numpy,loops,Python,Arrays,Numpy,Loops,我有一组这样的数据: 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]] 我已经成功地编写了一段代码,可以对特定的列值执行此操作,但无法解决如何将其转换为循环来执行整个数组:
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])
找到每个列值的最大值(这就是我需要帮助的地方!):
提前感谢您提供的任何帮助 这是一种可能的单行解决方案,无需使用任何附加库:
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)]
这是一种可能的单行解决方案,无需使用任何其他库:
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]]
说明:
:从numpy数组创建数据帧pd.DataFrame(交互)
:按第一列对数据进行分组groupby(0)
:查找每个组中第二列的最大值max()
:将groupby对象转换为数据帧重置索引()
:将数据帧转换为numpy数组to_numpy()
0
并取max并转换回numpy数组:
import pandas as pd
pd.DataFrame(interactions).groupby(0).max().reset_index().to_numpy()
输出:
[[0 3]
[1 4]
[2 7]]
说明:
:从numpy数组创建数据帧pd.DataFrame(交互)
:按第一列对数据进行分组groupby(0)
:查找每个组中第二列的最大值max()
:将groupby对象转换为数据帧重置索引()
:将数据帧转换为numpy数组to_numpy()
- 这方面的
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)
这方面的
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)
“索引”(第一列)值是否必须排序(如您的示例所示)?是的,第一列按升序排列?是否“索引”(第一列)值必须排序(如您的示例所示)?是的,第一列按升序排列?谢谢!“你能解释一下代码在做什么吗?”okvoyce在帖子中补充道。希望这有助于澄清代码。嗨,谢谢!“你能解释一下代码在做什么吗?”okvoyce在帖子中补充道。希望这有助于澄清代码。嗨,谢谢!我所有的值都是正的,所以我需要np.flatnonzero项吗?是的
flatnonzero
正在查找索引,而不是值。不管怎样,他们总是积极的。啊,好的,太好了,谢谢@DanielF喜欢纯numpy方法的答案。upvote.@ehsan如果索引没有被排序,我可能会按照您的答案推荐一个pandas
groupby
解决方案,尽管也可以先排序数组并停留在numpy
中。您好,谢谢!我所有的值都是正的,所以我需要np.flatnonzero项吗?是的flatnonzero
正在查找索引,而不是值。不管怎样,他们总是积极的。啊,好的,太好了,谢谢@DanielF喜欢纯numpy方法的答案。upvote.@ehsan如果索引没有被排序,我可能会按照您的答案推荐一个pandas
groupby
解决方案,尽管也可以先排序数组并停留在numpy
中。