Python Numpy:如何找到数组中最频繁的非零值?

Python Numpy:如何找到数组中最频繁的非零值?,python,arrays,numpy,Python,Arrays,Numpy,假设我有一个形状为(1,4,5)的numpy数组 我想在数组中找到一个特定轴上最常见的非零值,只有在没有其他非零值的情况下才返回零 假设我在看axis=2,我想从这个数组中得到类似于[[3,2,0,2]]的东西(对于最后一行,1或2都可以)。有没有一个好的方法来实现这一点 我已经尝试了以下问题()中的解决方案,但我不确定如何修改它以使其排除特定值。再次感谢 我们可以使用和一个简单的函数来解决这个问题。在这里,我们使用来计算数值的出现次数,然后获得最高出现次数。如果除了排除之外没有其他值,我们将返

假设我有一个形状为
(1,4,5)
的numpy数组

我想在数组中找到一个特定轴上最常见的非零值,只有在没有其他非零值的情况下才返回零

假设我在看axis=2,我想从这个数组中得到类似于
[[3,2,0,2]]
的东西(对于最后一行,1或2都可以)。有没有一个好的方法来实现这一点

我已经尝试了以下问题()中的解决方案,但我不确定如何修改它以使其排除特定值。再次感谢

我们可以使用和一个简单的函数来解决这个问题。在这里,我们使用来计算数值的出现次数,然后获得最高出现次数。如果除了
排除
之外没有其他值,我们将返回它

代码:

输出:

array([[3, 2, 0, 1]])
array([[-3,  2,  0, -5]])
请注意,如果传递空数组,它也将返回
exclude

编辑: 正如Ehsan所指出的,上述解决方案对于给定数组中的负值不起作用。在这种情况下,请从以下位置使用
计数器

输出:

array([[3, 2, 0, 1]])
array([[-3,  2,  0, -5]])

most_common(1)
计数器
对象中出现次数最多的值作为一个元素列表返回,该列表包含一个元组,其中第一个元素是值,第二个元素是其出现次数。这是作为列表返回的,因此是双重索引。如果列表为空,则大多数常见的未找到任何实例(仅排除或为空)。

这是另一种解决方案(可能没有上述解决方案有效,但是唯一的解决方案)-


np.bincount
用于非负数组。如果数组包含负值,此解决方案将失败。数组是否也包含负值?对于axis=0和axis=1的情况,您能否提供上述示例的所需输出?我目前正在处理简单的非负整数数组。我不太确定axis=0的输出应该是什么样子,但axis=1应该是
[[2,1,2,3,2]]
我想。是不是你的数组总是三维非负的,你只对axis=1和2感兴趣?这将改变最佳解决方案。
array([[-3,  2,  0, -5]])
#Gets the positions for the highest frequency numbers in axis=2
count_max_pos = np.argmax(np.sum(np.eye(5)[arr][:,:,:,1:], axis=2), axis=2)[0]+1

#gets the max values in based on the indices
k = enumerate(count_max_pos)
result = [arr[0][i] for i in k]

print(result)
[3,2,0,1]