【问题标题】:Row or column wise most frequent elements in 2-D numpy array二维numpy数组中的行或列最频繁的元素
【发布时间】:2020-05-10 22:27:35
【问题描述】:

我正在尝试在二维 numpy 数组中查找最常见的元素。我希望它们按行或按列。我搜索了文档和网络,但找不到我正在寻找的确切内容。让我用一个例子来解释;假设我有一个arr 如下:

import numpy as np
arr = np.random.randint(0, 2, size=(5, 2))
arr

# Output
array([[1, 1],
       [0, 0],
       [0, 1],
       [1, 1],
       [1, 0]])

预期输出是一个数组,其中包含列或行中最常见的元素,具体取决于给定的axis 输入。我知道np.unique() 返回给定axis 的输入数组中每个唯一值的计数。因此,它计算二维数组中的唯一行或列:

np.unique(arr, return_counts=True, axis=0)

# Output
(array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]]), array([1, 1, 1, 2]))

因此,它表明唯一元素 [0, 0][0, 1][1, 0] 出现一次,而 [1, 1]arr 中出现两次。这对我不起作用。因为我需要查看行(或列)中出现频率最高的元素。所以我的预期输出如下:

array([[1, 1],    # --> 1
       [0, 0],    # --> 0
       [0, 1],    # --> 0 or 1 since they have same frequency
       [1, 1],    # --> 1
       [1, 0]])   # --> 0 or 1 since they have same frequency

因此,结果可以是array([1, 0, 0, 1, 0])array([1, 0, 1, 1, 1]),形状为(5, )

PS:

我知道可以通过遍历列或行并使用np.unique() 查找最常见的元素来找到解决方案,但是我想找到最有效的方法。因为,通常 numpy 用于大型数组的矢量化计算,在我的情况下,输入数组 arr 的元素太多。如果使用 for 循环,计算成本会很高。

感谢每一个解释性答案。

编辑:

为了更清楚,我添加了一个基于循环的解决方案。由于arr 不仅可以包含 0 和 1,还可以包含不同的元素,因此我决定使用不同的随机 arr

arr = np.random.randint(1, 4, size=(10, 3)) * 10

# arr:
array([[30, 30, 30],
       [10, 20, 30],
       [30, 30, 30],
       [30, 10, 20],
       [20, 20, 10],
       [20, 30, 20],
       [20, 30, 10],
       [10, 30, 10],
       [20, 10, 10],
       [20, 30, 30]])

most_freq_elem_in_rows = []
for row in arr:
  elements, counts = np.unique(row, return_counts=True)
  most_freq_elem_in_rows.append(elements[np.argmax(counts)])

# most_freq_elem_in_rows:
# [30, 10, 30, 10, 20, 20, 10, 10, 10, 30]

most_freq_elem_in_cols = []
for col in arr.T:
  elements, counts = np.unique(col, return_counts=True)
  most_freq_elem_in_cols.append(elements[np.argmax(counts)])

# most_freq_elem_in_cols:
# [20, 30, 10]

然后,most_freq_elem_in_rowsmost_freq_elem_in_cols 可以简单地使用 np.array() 转换为 numpy 数组

【问题讨论】:

  • 你能告诉我们基于循环的解决方案吗?
  • 你为什么要问基于循环的解决方案?
  • 因为它对我来说并不完全清楚。因此,基于循环的循环可以澄清事情。
  • 我问得尽可能清楚,即使我添加了一个例子。无论如何,我会编辑问题。
  • 因此,使用编辑后的代码,您似乎希望在行和列中获得mode。所以,你可以使用这个问答 - stackoverflow.com/questions/16330831

标签: python numpy multidimensional-array


【解决方案1】:

如果你可以添加 scipy 依赖,那么scipy.stats.mode 可以实现:

import numpy as np
from scipy.stats import mode

arr = np.random.randint(0, 2, size=(5, 2))

mode(arr, 0)
ModeResult(mode=array([[0, 0]]), count=array([[3, 3]]))

mode(arr,1)
ModeResult(mode=array([[0],
                       [1], 
                       [0],
                       [0],
                       [0]]), 
           count=array([[1],
                        [2],
                        [2],
                        [2],
                        [1]]))

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多