【发布时间】: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_rows 和 most_freq_elem_in_cols 可以简单地使用 np.array() 转换为 numpy 数组
【问题讨论】:
-
你能告诉我们基于循环的解决方案吗?
-
你为什么要问基于循环的解决方案?
-
因为它对我来说并不完全清楚。因此,基于循环的循环可以澄清事情。
-
我问得尽可能清楚,即使我添加了一个例子。无论如何,我会编辑问题。
-
因此,使用编辑后的代码,您似乎希望在行和列中获得
mode。所以,你可以使用这个问答 - stackoverflow.com/questions/16330831
标签: python numpy multidimensional-array