繁体   English   中英

在 numpy 二维数组行中查找最常见的值,否则返回最大值

[英]Find most common value in numpy 2d array rows, otherwise return maximum

我有一个这样的数组

Nbank = np.array([[2, 3, 1],
                  [1, 2, 2],
                  [3, 2, 1],
                  [3, 2, 1],
                  [2, 3, 2],
                  [2, 2, 3],
                  [1, 1, 3],
                  [2, 1, 1],
                  [2, 2, 3],
                  [1, 1, 1],
                  [2, 1, 1],
                  [2, 3, 1],
                  [1, 2, 1]])

我想返回一个只有一列的数组。 条件是返回每一行中最常见的值; 如果多个值的出现次数相同,则只返回其中的最大值。

我用了这段代码

most_f = np.array([np.bincount(row).argmax() for row in Nbank])

如果多个值的出现次数相同,则返回第一项而不是最大值。 我该如何解决这个问题?

这可以给出数组中存在的最大值

Nbank.max()

您可以在按行降序排序后使用计数器。 有一个most_common会返回你想要的。 由于它已经排序,第一个元素总是最大或最频繁的。

import numpy as np
from collections import Counter
Nbank = np.array([[2, 3, 1],
                  [1, 2, 2],
                  [3, 2, 1],
                  [3, 2, 1],
                  [2, 3, 2],
                  [2, 2, 3],
                  [1, 1, 3],
                  [2, 1, 1],
                  [2, 2, 3],
                  [1, 1, 1],
                  [2, 1, 1],
                  [2, 3, 1],
                  [1, 2, 1]])


np.array([Counter(sorted(row, reverse=True)).most_common(1)[0][0] for row in Nbank])

Output

array([3, 2, 3, 3, 2, 2, 1, 1, 2, 1, 1, 3, 1])

我相信这会解决问题。 您可能会通过一些花哨的列表理解将其变成一个单行,但我认为这不值得。

most_f = []
for n in Nbank: #iterate over elements
    counts = np.bincount(n) #count the number of elements of each value
    most_f.append(np.argwhere(counts == np.max(counts))[-1][0]) #append the last and highest

您可以稍微作弊并反转每一行,以使np.argmax返回对应于最大项目的最右边出现的索引:

N = np.max(arr)
>>> [N - np.argmax(np.bincount(row, minlength=N+1)[::-1]) for row in Nbank]
[3, 2, 3, 3, 2, 2, 1, 1, 2, 1, 1, 3, 1]

如果您想充分利用numpy ,您可能还想避免循环,这绝对是可取的。 不幸的是,二维np.bincount不支持 np.bincount,但您可以手动执行:

N, M = arr.shape[0], np.max(arr)+1
bincount_2D = np.zeros(shape=(N, M), dtype=int)
advanced_indexing = np.repeat(np.arange(N), arr.shape[1]), arr.ravel()
np.add.at(bincount_2D, advanced_indexing, 1)
>>> bincount_2D
array([[0, 1, 1, 1],
       [0, 1, 2, 0],
       [0, 1, 1, 1],
       [0, 1, 1, 1],
       [0, 0, 2, 1],
       [0, 0, 2, 1],
       [0, 2, 0, 1],
       [0, 2, 1, 0],
       [0, 0, 2, 1],
       [0, 3, 0, 0],
       [0, 2, 1, 0],
       [0, 1, 1, 1],
       [0, 2, 1, 0]])

然后同时对所有行重复该过程:

>>> M -1 - np.argmax(bincount_2D[:,::-1], axis=1)
array([3, 2, 3, 3, 2, 2, 1, 1, 2, 1, 1, 3, 1], dtype=int64)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM