数组Numpy中非零元素的查找模式

hmmo2u0o  于 2023-10-19  发布在  其他
关注(0)|答案(3)|浏览(103)

在一个多维非零元素数组中,找到每行的模式的最有效方法是什么?
举例来说:

[
 [0.  0.4 0.6 0.  0.6 0.  0.6 0.  0.  0.6 0.  0.6 0.6 0.6 0.  0.  0.  0.6
     0.  0.  0.  0.  0.  0.  0.  0.  0.5 0.6 0.  0.  0.6 0.6 0.6 0.  0.  0.6
     0.6 0.6 0.  0.5 0.6 0.6 0.  0.  0.6 0.  0.6 0.  0.  0.6],
 [0.  0.1 0.2 0.1 0.  0.1 0.1 0.1 0.  0.1 0.  0.  0.  0.1 0.1 0.  0.1 0.1
 0.  0.1 0.1 0.1 0.  0.1 0.1 0.1 0.  0.1 0.2 0.  0.1 0.1 0.  0.1 0.1 0.1
 0.  0.2 0.1 0.  0.1 0.  0.1 0.1 0.  0.1 0.  0.1 0.  0.1]
]

上面的模式是[0, 0.1],但理想情况下我们希望返回[0.6, 0.1]

oalqel3c

oalqel3c1#

您将使用与this问题(在@yatu的评论中提到)相同的方法,但改为调用numpy.nonzero()方法。
为了只得到非零元素,我们可以调用nonzero方法,它将返回非零元素的索引。如果a是一个numpy数组,我们可以使用这个命令:
a[nonzero(a)]
示例查找模式(从其他答案中构建代码):

import numpy as np
from scipy import stats

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

def nonzero_mode(arr):
    return stats.mode(arr[np.nonzero(arr)]).mode

m = map(nonzero_mode, a)
print(m)

如果你想得到每一行的模式,只需使用一个遍历数组的循环:

for row in a:
   print(nonzero_mode(row))
f8rj6qna

f8rj6qna2#

从这个answer中删除零元素:

def mode(arr):
    """
    Function: mode, to find the mode of an array.
    ---
    Parameters:
    @param: arr, nd array, any.
    ---
    @return: the mode value (whatever int/float/etc) of this array.
    """
    vals,counts = np.unique(arr, return_counts=True)
    if 0 in vals:
        z_idx = np.where(vals == 0)
        vals   = np.delete(vals,   z_idx)
        counts = np.delete(counts, z_idx)
    index = np.argmax(counts)
    return vals[index]
67up9zun

67up9zun3#

this answer的启发,您可以将stats.modenp.nan一起使用

import numpy as np
from scipy import stats

a = np.array([
    [1, 0, 4, 2, 2, 7],
    [5, 2, 0, 1, 4, 1],
    [3, 3, 2, 0, 1, 1]]
)
nonzero_a = np.where(a==0, np.nan, a)
mode, count = stats.mode(nonzero_a,axis=1, nan_policy='omit')

你就会得到
模式:

masked_array(
  data=[[2.],
        [1.],
        [1.]],
  mask=False,
  fill_value=1e+20)

计数:

masked_array(
  data=[[2.],
        [2.],
        [2.]],
  mask=False,
  fill_value=1e+20)

注意如果计数轴上沿着的值都是np.nan,则模式未定义。

相关问题