【问题标题】:Major vote by column?主要按列投票?
【发布时间】:2020-01-25 22:03:20
【问题描述】:

我有一个 20x20 二维数组,我想从中获取每列出现次数最多的值(不包括零),即获得主要投票的值。

我可以为这样的单个列做到这一点:

 : np.unique(p[:,0][p[:,0] != 0],return_counts=True)
 : (array([ 3, 21], dtype=int16), array([1, 3]))

 : nums, cnts = np.unique(p[:,0][ p[:,0] != 0 ],return_counts=True)
 : nums[cnts.argmax()]
 : 21

为了完整起见,我们可以将早先提出的方法扩展到二维数组的基于循环的解决方案 -

# p is 2D input array
for i in range(p.shape[1]):
    nums, cnts = np.unique(p[:,i][ p[:,i] != 0 ],return_counts=True)
    output_per_col = nums[cnts.argmax()]

如何在不使用 for 循环的情况下对所有列执行此操作?

【问题讨论】:

  • 里面都是正数吗?
  • 请按照您创建此帐户时的建议遵循帮助文档中的发布指南。 On topichow to ask 和 ...the perfect question 在此处申请。 StackOverflow 不是设计、编码、研究或教程资源。但是,如果您按照您在网上找到的任何资源,做出诚实的解决方案尝试,并遇到问题,您就会有一个很好的例子可以发布。
  • 如果您在浏览器中搜索“numpy vector usage”,您会找到比我们在此处管理的更能解释这一点的参考资料。
  • 是的,他们都是积极的
  • 发布的解决方案对您有用吗?

标签: python numpy vote


【解决方案1】:

我们可以使用bincount2D_vectorized 来获取每列的分箱计数,其中分箱将是每个整数。然后,只需从第二个计数开始切出(因为第一个计数将用于0)并得到argmax,添加1(以补偿切片)。这就是我们想要的输出。

因此,解决方案显示为示例案例运行 -

In [116]: p # input array
Out[116]: 
array([[4, 3, 4, 1, 1, 0, 2, 0],
       [4, 0, 0, 0, 0, 0, 4, 0],
       [3, 1, 3, 4, 3, 1, 4, 3],
       [4, 4, 3, 3, 1, 1, 3, 2],
       [3, 0, 3, 0, 4, 4, 4, 0],
       [3, 0, 0, 3, 2, 0, 1, 4],
       [4, 0, 3, 1, 3, 3, 2, 0],
       [3, 3, 0, 0, 2, 1, 3, 1],
       [2, 4, 0, 0, 2, 3, 4, 2],
       [0, 2, 4, 2, 0, 2, 2, 4]])

In [117]: bincount2D_vectorized(p.T)[:,1:].argmax(1)+1
Out[117]: array([3, 3, 3, 1, 2, 1, 4, 2])

需要转置,因为bincount2D_vectorized 为我们提供了每行的 2D bincounts。因此,对于获取每行排名的替代问题,只需跳过该转置即可。

此外,请随意探索链接问答中的其他选项以获取2D-bincounts

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多